像GenericServlet实现Servlet接口的方式去实现Filter接口

编写Filter的时候,我们需要实现Filter接口,需要去实现init(FilterConfig arg0),doFilter(ServletRequest request, ServletResponse response, FilterChain chain),destroy()等方法,有时候我们并不需要去实现init与destory方法,但又必须在代码里面写上这两个方法.如果我们不想多写这个两个方法,我们可以用一个类去实现Filter接口,在我们开发的时候直接继承这个类,实现doFilter方法即可.

代码如下:

 1 package com.zhx.http.filter;
 2
 3 import java.io.IOException;
 4
 5 import javax.servlet.Filter;
 6 import javax.servlet.FilterChain;
 7 import javax.servlet.FilterConfig;
 8 import javax.servlet.ServletException;
 9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13
14 /**
15  *
16  * @author zhaoxin
17  * 自定义的HttpFilter,实现Filter接口,参考自GenericServlet的实现方式
18  */
19 public abstract class HttpFilter implements Filter,java.io.Serializable {
20
21     private static final long serialVersionUID = 1L;
22
23     private FilterConfig filterConfig;
24
25     /**
26      * 该方法由servlet容器进行调用,有且只调用一次
27      * 不建议子类直接重写该方法
28      */
29     @Override
30     public void init(FilterConfig arg0) throws ServletException {
31         this.filterConfig = arg0;
32         this.init();
33     }
34
35     /**
36      * 供子类重写的初始化方法,在子类中可以在init()方法中调用getFilterConfig()方法来获取FilterConfig对象,来获取初始化参数
37      * @throws ServletException
38      */
39     protected void init() throws ServletException {
40         //TODO Auto-generated method stub
41     }
42
43     /**
44      * 供子类调用,来获取FilterConfig对象
45      * @return
46      */
47     public FilterConfig getFilterConfig() {
48         return filterConfig;
49     }
50
51     /**
52      * 该方法由servlet容器调用,不建议之类直接进行重写
53      */
54     @Override
55     public void doFilter(ServletRequest req, ServletResponse res,
56             FilterChain fc) throws IOException, ServletException {
57
58         HttpServletRequest request;
59         HttpServletResponse response;
60
61         try {
62             request = (HttpServletRequest)req;
63             response = (HttpServletResponse)res;
64         } catch (Exception e) {
65              throw new ServletException("non-HTTP request or response");
66         }
67         doFilter(request, response, fc);
68     }
69
70     /**
71      * 该方法由子类必须重写的过滤方法
72      * @param request
73      * @param response
74      * @param filterChain
75      * @throws IOException
76      * @throws ServletException
77      */
78     public abstract void doFilter(HttpServletRequest request, HttpServletResponse response,
79             FilterChain filterChain) throws IOException, ServletException;
80
81     /**
82      * 由servlet容器进行调用
83      */
84     @Override
85     public void destroy() {
86         // TODO Auto-generated method stub
87
88     }
89
90 }

开发的时候我们只需新建一个类,然后去继承HttpFilter即可.如果有初始化的需要,建议重写无参的init()方法,如果想在该方法内使用FilterConfig对象,通过调用this.getFilterConfig()方法即可获得.编写过滤方法时建议重写doFilter(HttpServletRequest request, HttpServletResponse response,FilterChain filterChain).该方法的好处是可以直接使用HttpServletRequest,HttpServletResponse,不用自己再去将ServletRequest,ServletResponse对象强制转换为HttpServletRequest,HttpServletResponse对象.如果有释放资源等操作的时候,直接重写destory()方法即可,没有的话就不用重写.可以让代码看上去更美观.

时间: 2024-10-08 15:55:11

像GenericServlet实现Servlet接口的方式去实现Filter接口的相关文章

Servlet接口应用(开发servlet三种方式)

第一种:实现Servlet接口 public class ServletDemo1 implements Servlet { @Override public void init(ServletConfig config) throws ServletException { // TODO Auto-generated method stub } @Override public ServletConfig getServletConfig() { // TODO Auto-generated

APIJSON,让接口见鬼去吧!

我: https://github.com/TommyLemon/APIJSON 服务端: 什么鬼? 客户端: APIJSON是啥? 我: APIJSON是一种JSON传输结构协议. 客户端可以定义任何JSON结构去向服务端发起请求,服务端就会返回对应结构的JSON字符串,所求即所得. 一次请求任意结构任意数据,方便灵活,不需要专门接口或多次请求. 还能去除重复数据,节省流量提高速度! 从此HTTP传输JSON数据没有接口,更不需要文档! 客户端再也不用和服务端沟通接口或文档问题了!再也不会被文

PHP通过XML报文方式,已第三方接口交互(发送xml,获取XML,并解析xml步骤)

开发者端:发送请求,并接收结果 <?php // 下面的demo,实现的功能如下: // 1-开发者需要判断一个用户是否存在,去请求第三方接口. // 2-与第三方接口的通信,是以xml格式传送数据.开发者把用户信息以xml格式发送给第三方接口 // 3-第三方接口获取开发者的xml数据,通过数据的查询,把结果再以xml的格式发送给开发者. //首先检测是否支持curl if (!extension_loaded("curl")) { trigger_error("对不

EF异步改造之路~第二回 让DbContextRepository去实现异步接口

上一讲中,我们定义了三个异步操作接口,这回我们将对它进行实现,而有一个基础知识需要大家清楚,那就是实现接口的方式,一般我们使用默认的方式(隐式实现),这种方法实现的接口方式均为public,即它可以脱离接口,而直接通过类对象去访问,而当一个类继承多个接口,而这些接口中都有相同的方法时,我们就需要显示实现接口了,显示实现的接口成员只能通过接口实例去访问它,今天我们对DbContextRepository的改造就用到了这个特性. 基本关键字 async:用来标识这个方法为异步方法 await:用在异

Java创建线程的第二种方式:实现runable接口

/*需求:简单的卖票程序多个窗口买票 创建线程的第二种方式:实现runable接口 *//*步骤1.定义类实现Runable接口2.覆盖Runable接口中的run方法    将线程要运行的代码存放在该run方法中 3.通过Thread类建立线程对象4.将Runable接口的子类对象作为实际参数传递给Thread类的构造函数  为什么要将Runable接口的子类对象传递给Thread的构造函数.  因为,自定义的run方法所属的对象是Runable接口的子类对象  所以要让线程去指定对象的Run

PHP通过XML报文格式的POST请求方式,与第三方接口交互(发送xml,获取XML,并解析xml步骤)

开发者端:发送请求,并接收结果 <?php // 下面的demo,实现的功能如下: // 1-开发者需要判断一个用户是否存在,去请求第三方接口. // 2-与第三方接口的通信,是以xml格式传送数据.开发者把用户信息以xml格式发送给第三方接口 // 3-第三方接口获取开发者的xml数据,通过数据的查询,把结果再以xml的格式发送给开发者. //首先检测是否支持curl if (!extension_loaded("curl")) { trigger_error("对不

扩展GenericServlet实现Servlet程序 学习笔记

import java.io.IOException; import javax.servlet.GenericServlet; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; //扩展GenericServlet实现Servlet程序 public class Demo12 extends GenericServle

Java之多线程方式二(实现Runnable接口)

/** * 创建多线程的方式二:实现Runnable接口 * 1. 创建一个实现了Runnable接口的类 * 2. 实现类去实现Runnable中的抽象方法:run() * 3. 创建实现类的对象 * 4. 将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象 * 5. 通过Thread类的对象调用start() * * * 比较创建线程的两种方式. * 开发中:优先选择:实现Runnable接口的方式 * 原因:1. 实现的方式没有类的单继承性的局限性 * 2. 实现的方

.NET中的三种接口实现方式

摘自:http://www.cnblogs.com/zhangronghua/archive/2009/11/25/1610713.html 一般来说.NET提供了三种不同的接口实现方式,分别为隐式接口实现.显式接口实现.混合式接口实现.这三种方式各有各的特点. 首先来看隐式接口实现,这恐怕是我们使用最多的一种接口实现,因为隐匿接口实现是.NET的默认接口实现方式.下面让我们来看一个隐式接口实现的例子: using System; internal class MyClass { public