`

Servlet之Filter及FilterChain的使用详解

    博客分类:
  • JSP
阅读更多
在 JavaEE 中没有 Interceptor(拦截器)的概念,不要和Struts2和Spring中的混淆。
但是有 Filter(过滤器),它实质就起拦截器的作用。

过滤器有两个要素:
1、实现一个接口:javax.servlet.Filter。
2、绑定访问路径,对其进行过滤。


一、什么是 Filter(过滤器)?
    Filter 是一个 Object, 用于改变 request/response 对象的请求头和请求体。
    Filter 与其它的 web 组件不同的是,Filter 一般不会自己创建 response 对象对 web 请求进行响应,而是只提供方法,这些方法可绑定于任何 web 请求的资源。
    可以对一个 web 资源配置一个或多个 Filter。
   
二、Filter 的主要任务:   
    1. 过滤请求
    2. 拦截请求或相应
    3. 修改 request 对象的 header 和 body。(需要提供自定义的 request 对象)
    4. 修改 response 对象的 header 和 body。(需要提供自定义的 response 对象)
    5. 与外部资源交互
   
三、Filter 的用途:   
    权限认证、日志、图片转换、数据压缩、加密、标记(Token)、XML转换等等。
   
四、使用 Filter   
    filter API 定义在 javax.servlet 包下的 Filter, FilterChain, FilterConfig 类中。
   
    使用 Filter 需要两步:
    1、定义一个Filter 类(必须实现 Filter 接口)
    2、配置 Filter(在 web.xml 中配置 或者是使用 @WebFilter 注解)

1、定义一个Filter 类(必须实现 Filter 接口)   
    在 Filter 类中必须实现 Filter 接口的三个方法:   
        init(FilterConfig filterConfig):
            Filter 实例化时被调用。
        doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            Filter类的主要方法。
        destroy()
   
package com.test.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
public class SecurityFilter implements Filter {
    private FilterConfig filterConfig;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        ServletContext context = this.filterConfig.getServletContext();
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response; 
        HttpSession session = req.getSession();
        if (session.getAttribute("username") != null) {
            context.log("Authentication passed.");
            chain.doFilter(request, response);
        } else {
            context.log("Authentication failed.");
            res.sendRedirect("../failure.jsp");
        }
    }
    @Override
    public void destroy() {
        this.filterConfig = null;
    }
}



2、配置 Filter(在 web.xml 中配置 或者是使用 @WebFilter 注解)
   
    1)在 web.xml 配置:
   
    <filter> 
        <filter-name>SecurityFilter</filter-name> 
        <filter-class> com.test.filter.SecurityFilter</filter-class> 
    </filter> 
    <filter-mapping> 
        <filter-name>SecurityFilter</filter-name> 
        <url-pattern>/*</url-pattern>
    </filter-mapping> 

   
    2)使用 @WebFilter 注解(Since: Servlet 3.0)

    package com.test.filter;

    import javax.servlet.Filter;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.annotation.WebInitParam;

    @WebFilter(
        filterName = "SecurityFilter",
        urlPatterns = {"/*"},
        initParams = {
            @WebInitParam(name = "mood", value = "awake")
        }
    )
    public class SecurityFilter implements Filter {
        //...
    }

 

四、Filter 与 Interceptor 的区别  

1、Filter介绍
      Filter可以认为是Servlet的一种“加强版”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。Filter也可以对用户请求生成响应,这一点与Servlet相同,但实际上很少会使用Filter向用户请求生成响应。使用Filter完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行预处理并生成响应,最后Filter再对服务器响应进行后处理。

2、Struts - Interceptor介绍
     拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

3、Filter和 Struts - Interceptor 的区别
- Filter是基于函数回调的(责任链设计模式),而Interceptor则是基于Java反射的(AOP设计模式)。
- Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
- Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
- Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
- 在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。

4、Filter和 Spring - HandlerInterceptor 的区别
HandlerInterceptor is basically similar to a Servlet 2.3 Filter.
But in contrast to the latter it just allows custom pre-processing with the option of prohibiting the execution of the handler itself, and custom post-processing.





引用:

http://docs.oracle.com/javaee/6/tutorial/doc/bnagb.html
http://blog.csdn.net/zhaozheng7758/article/details/6105749
http://docs.oracle.com/javaee/6/api/javax/servlet/annotation/WebFilter.html
http://www.cnblogs.com/luoyun/archive/2013/01/04/2844274.html





-
转载请注明
原文出处:http://lixh1986.iteye.com/blog/1765692








-


分享到:
评论

相关推荐

    自定义FilterChain的编写

    不使用Servlet Filter接口,自定义FilterChain处理多个Filter执行顺序问题

    javax.servlet.jar下载

    javax.servlet.FilterChain.class javax.servlet.ServletRequestEvent.class javax.servlet.Filter.class javax.servlet.FilterConfig.class javax.servlet.ServletRequestAttributeListener.class javax.servlet....

    Servlet过滤器使用

    1、Filter接口:所有的Servlet过滤器类都必须实现javax.servlet.Filter接口 a、init(FilterConfig): 这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取...

    Filter_Listener相信代码使用

    * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ...

    servlet-api-2.4.jar.zip

    javax.servlet.Filter javax.servlet.Servlet javax.servlet.FilterChain javax.servlet.http.Cookie javax.servlet.FilterConfig javax.servlet.ServletConfig javax.servlet.GenericServlet javax.servlet....

    Filter过滤器

    在 Servlet API 中定义了三个接口类来开供开发人员编写 Filter 程序:Filter, FilterChain, FilterConfig。 Filter 程序是一个实现了 Filter 接口的 Java 类,与 Servlet 程序相似,它由 Servlet 容器进行调用和...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    20.2.3 filterchain接口 590 20.3 过滤器的部署 591 20.4 过滤器的开发 592 20.5 对用户进行统一验证的过滤器 594 20.6 对请求和响应数据进行替换的 20.6 过滤器 600 20.7 小结 609 第21章 中文乱码问题与...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    20.2.3 filterchain接口 590 20.3 过滤器的部署 591 20.4 过滤器的开发 592 20.5 对用户进行统一验证的过滤器 594 20.6 对请求和响应数据进行替换的 20.6 过滤器 600 20.7 小结 609 第21章 中文乱码问题与...

    servlet2.4doc

    doFilter(ServletRequest, ServletResponse, FilterChain) - Method in interface javax.servlet.Filter The doFilter method of the Filter is called by the container each time a request/response pair is ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    20.2.3 filterchain接口 590 20.3 过滤器的部署 591 20.4 过滤器的开发 592 20.5 对用户进行统一验证的过滤器 594 20.6 对请求和响应数据进行替换的 20.6 过滤器 600 20.7 小结 609 第21章 中文乱码问题与...

    购物车源码

    import javax servlet Filter; import javax servlet FilterChain; import javax servlet FilterConfig; import javax servlet RequestDispatcher; import javax servlet ServletException; import javax servlet ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    20.2.3 filterchain接口 590 20.3 过滤器的部署 591 20.4 过滤器的开发 592 20.5 对用户进行统一验证的过滤器 594 20.6 对请求和响应数据进行替换的 20.6 过滤器 600 20.7 小结 609 第21章 中文乱码问题与...

    struts2-1.zip

    MVC模式(model view controller) 模型:封装应用程序的数据和业务逻辑(POJO...对于servlet来说,拦截资源不是其所擅长的filter中的filterchain,这个API是servlet所没有的 Struts2中最主要的一个就是过滤器filter

    登录过滤器

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; ...

    跨域访问Filter实例

    JAVA配置跨越访问Filter APP要访问WEB系统,需要进行跨域设置 关键: public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {}

    聊天室程序下载

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (encoding != null) { request.setCharacterEncoding(encoding); ...

    Filter过滤器和Listener监听器详解

    Filter过滤器和Listener监听器详解 Filter过滤器 Filter的简介 对资源的访问进行过滤,相当于小区的保安,进去要检查,出去还要检查。 Filter的使用 编写一个类,继承并实现javax.servlet.Filter。 package ...

    java servlet 监听器

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { MyRequest myRequest = null; HttpServletRequest request2 = ...

    JSP 开发中过滤器filter设置编码格式的实现方法

    JSP 开发中过滤器filter设置编码格式的实现方法 我们知道为了避免提交数据的乱码问题,需要在每次使用请求之前设置编码格式。...import javax.servlet.FilterChain; import javax.servlet.FilterConfig;

    c3p0工具包(jdbc)

    import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax....

Global site tag (gtag.js) - Google Analytics