`

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








-


分享到:
评论

相关推荐

    Servlet与jsp与Filter的使用

    ### Servlet与JSP与Filter的使用详解 #### 一、Servlet与JSP的基本概念 Servlet是一种Java技术,用于创建动态Web应用程序。它本质上是一个Java类,由Web服务器或应用服务器加载,以响应客户端请求。Servlet可以...

    Spring Boot使用Servlet及Filter过程详解

    Spring Boot 使用 Servlet 及 Filter 过程详解 在 Spring Boot 应用程序中,Servlet 和 Filter 是两个非常重要的概念,它们都是 Java Servlet 规范的一部分。在本文中,我们将详细介绍 Spring Boot 使用 Servlet 及...

    servlet系列之Filter

    Servlet系列之Filter详解 在Java Web开发中,Servlet和Filter是两个非常重要的概念。Servlet是Java EE标准中用于处理HTTP请求的核心组件,而Filter则是一个预处理或后处理Servlet请求和响应的机制,它允许开发者在...

    servlet过滤器详解

    ### Servlet过滤器详解 #### 一、Filter的基本概念与作用 **过滤器(Filter)**是一种Web组件,它能够在客户端请求到达目标资源(如Servlet、JSP页面等)之前进行预处理,以及在响应返回客户端之前进行后处理。...

    SpringBoot初始教程之Servlet、Filter、Listener配置详解

    SpringBootServlet、Filter、Listener配置详解 在SpringBoot中,Servlet、Filter、Listener是三个重要的组件,它们在Web应用程序中扮演着关键的角色。本篇文章将详细介绍如何在SpringBoot中配置Servlet、Filter、...

    j2ee过滤器Filter使用详解(实例)

    在Java企业级应用开发中,J2EE(Java 2 Platform, Enterprise Edition)提供了一种强大的组件模型,其中过滤器(Filter)是关键组件之一。本文将深入解析J2EE过滤器Filter的使用方法,并通过实例来阐述其工作原理。 ...

    Servlet3.0使用注解标注过滤器(Filter)

    ### Servlet 3.0 使用注解标注过滤器 #### 一、Servlet 3.0概述与新特性 Servlet 3.0 是 Java EE 6 的一部分,它引入了许多新的特性和改进,使得开发者能够更方便地开发 Web 应用程序。其中一个重要特性就是支持...

    Java_Filter过滤机制详解.doc

    ### Java Filter过滤机制详解 #### 一、什么是Filter Filter技术是Servlet 2.3版本中新引入的一个功能,它的主要作用在于对Web应用中的请求和响应进行预处理和后处理。Filter本身并不是一个Servlet,因此它不能...

    JavaWeb Servlet中Filter过滤器的详解

    Java Web开发中,Servlet Filter(过滤器)是一个重要的组件,它用于对web服务器上的所有web资源进行过滤,实现各种特殊功能,如权限访问控制、过滤敏感词汇、压缩响应信息等。Filter的作用是在Servlet被调用之前和...

    Java_Filter过滤机制详解.

    3. Filter通过调用`FilterChain.doFilter()`将请求传递给下一个Filter或目标Servlet。 4. 目标Servlet处理完请求后,响应开始返回。此时,Filter可以再次介入,对响应进行后处理,如添加响应头或修改响应数据。 5. ...

    Filter_Listener相信代码使用

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

    详解Servlet之过滤器(Filter)

    使用Servlet 之过滤器需要实现javax.servlet.Filter接口,重写抽象方法,编写doFilter()方法中的处理代码,并使用FilterChain调用FilterChain.doFilter(req, resp)方法,表示可以执行后面的拦截器(如果有的话)。...

    15_尚硅谷_Filter过滤器_王振国 - 课堂笔记1

    Filter 过滤器是 JavaWeb 的三大组件之一,另外两个组件是 Servlet 程序和 Listener 监听器。Filter 过滤器是一个接口,它的作用是拦截请求,过滤响应。常见的应用场景有权限检查、日记操作、事务管理等等。 ...

    java中filter的用法(过滤器)

    ### Java中的Filter(过滤器)使用详解 #### 一、Filter概述 在Java Web开发中,`Filter`是一种非常实用的技术,它可以在请求到达目标资源(如Servlet或JSP页面)之前进行预处理,或者在响应返回客户端之前进行后...

    servlet 过滤器大全

    ### Servlet过滤器详解 #### 一、字符编码过滤器 在Web开发中,尤其是在处理中文等多语言环境时,字符编码的问题尤为重要。如果字符编码设置不当,可能会导致页面出现乱码。为此,开发者通常会使用字符编码过滤器...

    servlet2.4api-javadoc 半中文

    8. **Filter接口和FilterChain类**:Servlet 2.4引入了过滤器(Filter)概念,允许在请求到达Servlet之前进行预处理,或在响应离开Servlet之后进行后处理。FilterChain允许过滤器链式调用。 9. **Listener接口**:...

    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章 中文乱码问题与...

    Filter学习心得

    2. **请求处理**:当请求到达时,容器会调用Filter的`doFilter(ServletRequest request, ServletResponse response, FilterChain chain)`方法来处理请求。 3. **销毁**:当Web应用停止时,容器会调用Filter的`...

Global site tag (gtag.js) - Google Analytics