过滤器(Filter)

Filter

Filter意为滤镜或者过滤器,用于在Servlet之外对request或者response进行修改。Filter提出了滤镜链的概念,客户端请求request在抵达Servlet之前会经过FilterChain里面的所有Filter,服务器响应response在从Servlet到达客户端之前也会经过FilterChain里面的所有Filter。其辱李过程如图:


一个Filter必须实现javax.servlet.Filter接口。其有三个方法。

  • void init(FilterConfig)创建之后,马上执行;Filter会在服务器启动时就创建!
  • void destory()销毁之前执行!在服务器关闭时销毁
  • void doFilter(ServletRequest,ServletResponse,FilterChain) 每次过滤时都会执行

其中init()和destroy()方法只会被调用一次,分别在Web程序加载或者卸载的时候调用,而doFilter()方法每次有客户端请求都会都会被调用一次,Filter的所有工作都集中在doFilter()中

由此,Filter可以完成的工作:

  • 在执行Servlet之前,首先执行Filter程序,并为之做一些预处理工作
  • 根据程序需要修改请求与响应
  • 在Servllet执行之后 截获Servlet的执行

Filter的开发主要分为2步:

  1. 编写java类实现Filter接口,并实现其doFilter方法。
  2. 在web.xml 文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。
这里有一个例子:
public class CharacterEncodingFilter implements Filter{ //编写CharacterEncodingFilter类
	
	protected String encoding ="";
	
	//在过滤器中  设置的字符编码为encoding 

	public void destroy() {
		encoding=null;
		
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		if(encoding==null){
			
			request.setCharacterEncoding(encoding);
			chain.doFilter(request, response);			
			
		}			
	}
	public void init(FilterConfig filterConfig) throws ServletException {
		this.encoding=filterConfig.getInitParameter("encoding");
		
	}

}

在web.xml中配置过滤器:

  <filter>
       <filter-name>CharacterEncodingFilter</filter-name>
       <filter-class>CharacterEncodingFilter</filter-class>
       <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
       </init-param>    
  </filter>
  <filter-mapping>
       <filter-name>CharacterEncodingFilter</filter-name>
       <url-pattern>/*</url-pattern>  
  </filter-mapping

FilterConfig接口

其与ServletConfig类似

用户在配置filter时,可以使用<init-param>为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了
filter初始化参数的filterConfig对象传递进来。因此在编写filter时,通过filterConfig对象的方法,就可获得:

  • String getFilterName():得到filter的名称。
  • String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
  • Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
  • public ServletContext getServletContext():返回Servlet上下文对象的引用。

过滤器的四种拦截方式

<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。
  • <dispatcher>REQUEST</dispatcher>
  • <dispatcher>FORWARD</dispatcher>
  • <dispatcher>INCLUDE</dispatcher>
  • <dispatcher>ERROR</dispatcher>

这些可以在<filter-mapping>中进行配置!

<dispatcher> 子元素可以设置的值及其意义:

  • REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
  • INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
  • FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
  • ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

猜你喜欢

转载自blog.csdn.net/hare_you/article/details/80561016