【DRP】拦截器Filter的使用


      1.Filter前言 


       Servlet过滤器----Filter可以动态地拦截请求和响应,在客户端访问后台资源前、在服务器响应发送回客户端前,都可以先使用过滤器。过滤器相当于给servlet加了一把锁,在servlet处理前,过滤掉一些不在考虑范围之内的东西。


        web.xml中元素执行的顺序listener->filter->struts拦截器->servlet。


       过滤器的概念:


        Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应。主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链。

        优点:过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。而在实际使用时,就要特别注意过滤链的执行顺序问题

        


         2.Filter类型

         Servlet过滤器种类:

         身份验证过滤器(AuthenticationFilters)。

         数据压缩过滤器(Datacompression Filters)。

         加密过滤器(EncryptionFilters)。

         触发资源访问事件过滤器。

         图像转换过滤器(ImageConversion Filters)。

         日志记录和审核过滤器(Loggingand Auditing Filters)。

         MIME-TYPE 链过滤器(MIME-TYPE Chain Filters)。

         标记化过滤器(TokenizingFilters)。

         XSL/T 过滤器(XSL/T Filters),转换 XML 内容。

 


         3.Filters使用方法

      

          Servlet过滤器实现了java扩展包中javax.servlet.filter接口,还要在web.xml中进行配置。javax是java的扩展包它定义了三个方法:


         一:public void doFilter(ServletRequest, ServletResponse, FilterChain)

              该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器。


         二:public voidinit(FilterConfig filterConfig)

              web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。


         三:public void destroy()

              Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。

 


         4.Filter运行过程:

 



        个人理解是这样的,我们把程序《drp》部署到Tomcate,当客户端发起请求时,Tomcate会根据请求的URL地址(并且携带请求数据)去部署的《drp》项目中找匹配的地址。但是在这中间当Tomcate找到WEB-INF时会先去检查下它的XML配置文件,看一下有什么需要注意的和路径映射关系。Filter要求写在servlet和映射关系之前,当Tomcate发现存在Filter时就会解析Filter的路径找到Filter类,根据Filter设置的匹配条件将符合条件的客户端请求通过doFilter()方法放到Fliter类中,再通过Filter类中的doFilter进行下一次跳转或者最终通过过滤器限制,进入请求地址。



          5.王勇老师的实例

          例子:通过添加用户功能增加字符集设置。

 

        一 : 编写CharsetEncodingFilter过滤器类,需要实现javax.Servlet.filter类的接口。

 

package com.bjpowernode.drp1.util.filter;
 
import java.io.IOException;
//filter类实现javac.servlet.filter接口后加载的jar包
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
 * 采用filter统一处理字符集
 * @author F-mdh
 *
 */
public classCharsetEncodingFilter implements Filter {
  //CharsetEncodingFilter实现Filter接口后,会自动加载filter的三个方法:destory();dofilter();init();
  //设置的字符集endcoding
  private String endcoding;
  @Override
  public void destroy() {
     // TODO Auto-generated method stub
 
  }
 
  @Override
  public void doFilter(ServletRequestrequest, ServletResponse response,
       FilterChainchain) throwsIOException, ServletException {
     //设置字符集:往请求数据中加上字符集
     request.setCharacterEncoding(endcoding);   
     //继续执行:继续进行跳转
     chain.doFilter(request,response);
  }
 
  @Override
  public void init(FilterConfigfilterConfig) throwsServletException {
     this.endcoding =filterConfig.getInitParameter("encoding");    
 
  }
 
}


         二:配置WEB-INF的XML文件,增加Filter过滤器类名、地址、匹配条件。

 

<?xml version="1.0"encoding="UTF-8"?>
<web-app version="2.4"
  xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
  http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 
 
  <!-- 配置filter的类和类的地址 -->
  <filter>
     <filter-name>CharsetEncodingFilter</filter-name>
     <filter-class>com.bjpowernode.drp1.util.filter.CharsetEncodingFilter</filter-class>
     <init-param>
       <param-name>encoding</param-name>
       <param-value>GBK</param-value>
     </init-param>  
  </filter>
 
  <!-- 配置filter的作用范围【扩展匹配】 -->
  <filter-mapping>
     <filter-name>CharsetEncodingFilter</filter-name>
     <url-pattern>*.jsp</url-pattern>
  </filter-mapping>
</web-app>
 


         6.知识补充

  

 Web.xml配置节点说明:

<filter>指定一个过滤器。

<filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。

<filter-class>元素用于指定过滤器的完整的限定类名。

<init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。

在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。

<filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径

<filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字

<url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)

<servlet-name>指定过滤器所拦截的Servlet名称。

 

 

         Filter可以看成一种横切性技术,和AOP都是面向切面编程。(终于对面向切面编程有一丝理解~~~AOP啊)。

         Filter只对Post请求起作用,Post请求将请求地址放在了URL中,和Request一起。

         Filter其实对Request和Response请求进行了拦截。




相关内容推荐