Java Web中的过滤器Filter

来源:互联网 发布:网络综艺节目排行榜 编辑:程序博客网 时间:2024/05/16 01:33
  一、什么是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>  


0 0
原创粉丝点击