一、什么是Filter

        与Servlet相似,过滤器是一些web应用程序组件,可以绑定到一个web应用程序中。但是与其他web应用程序组件不同的是,过滤器是"链"在容器的处理过程中的。这就意味着它们会在servlet处理器之前访问一个进入的请求,并且在外发响应信息返回到客户前访问这些响应信息。这种访问使得过滤器可以检查并修改请求和响应的内容。

        它与Servlet的区别在于:它不能直接向用户生成响应。完整的Filter流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

        Filter有如下几个作用:

        1. 在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest请求;

        2. 根据需要检查HttpServletRequest,也可以对HttpServletRequest头和数据进行修改;

        3. 在HttpServletResponse到达客户端之前,拦截HttpServletResponse;

        4. 根据需要检查HttpServletResponse,也可以对HttpServletResponse头和数据进行修改;

        5. Filter可以拦截多个请求和响应,一个请求和响应可以被多个Filter拦截。

        Filter有以下几个种类:

        1. 用户授权的Filter:Filter负责检查用户的请求,根据请求过滤用户的非法请求;

        2. 日志Filter:详细记录用户的请求信息;

        3. 负责解码的Filter:对非标准编码的解码;

        4. 能改变XML内容的XSLT Filter等。

        二、Filter的实现

        1. 创建Filter处理类:

        Filter处理类必须实现javax.servlet.Filter接口。该接口有3个方法:

        1) public void init(FilterConfig arg0) throws ServletException用于初始化Filter,只会在Web容器启动的时候自动调用而且只调用一次,FilterConfig 封装了Filter配置参数(init-param)内容信息,初始化的时候可以直接拿出来;在acegi安全认证中FilterConfig封装的是被代理对象。

        2) public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException,ServletException {用于实现过滤的方法,该方法会在每次请求中调用,或每次响应中调用;ServletRequest 封装了请求信息,ServletResponse 封装了响应信息;在chain.doFilter(req, res);代码执行之前进行的处理是对请求的预处理,在chain.doFilter(req, res);代码执行之后执行的处理是对响应进行的后处理,一般拥有权限的才调用chain.doFilter(req, res);方法或者跳转到错误页面。

        3) public void destroy() {用于进行资源释放,当过滤处理完毕后会调用该方法。

        2. web.xml中配置Filter:

        1) 配置Filter名,如下:

<filter>
        <filter-name>myFilter</filter-name>
        <filter-class>com.lanp.MyFilter</filter-class>
        <init-param> 
      		<param-name>super_role</param-name> 
      		<param-value>lanp</param-value> 
        </init-param> 
</filter>

        2) 配置要交给Filter拦截器处理的URL,如下:

<filter-mapping>
      <filter-name>myFilter</filter-name>
      <url-pattern>/*</url-pattern>
</filter-mapping>
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐