疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java web笔记之Filter初识


 

 

 
1.Filter简介
Filter意为滤镜或者过滤器,用于在Servlet之外对request或者response进行修改。Filter提出了滤镜链(FilterChain)的概念,一个FilterChain包括多个Filter。客户端请求request在抵达Servlet之前会经过FilterChain里的所有Filter,服务器响应response在从Servlet抵达客户端浏览器之前也会经过FilterChain里所有的Filter.
2.示例
<span style="font-size:18px;">package com.wang.indentity;
 
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
 
/**
 * Servlet Filter implementation class myFilter
 */
@WebFilter("/myFilter")
public class myFilter implements Filter {
 
    /**
     * Default constructor. 
     */
    public myFilter() {
        // TODO Auto-generated constructor stub
    }
 
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
 
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("request被处理之前");
//一定要执行这句话,否则不会执行Servlet代码
chain.doFilter(request, response);
System.out.println("request被处理之后,response抵达客户端之前");
}
 
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
 
}</span><span style="font-size:24px;">
</span>
chain.doFilter(request,response)将request递交给FilterChain中的下一个Filter,如果所有的Filter都走完了则交给Servlet处理。
注意:doFilter()方法中一定要执行chain.doFilter(request,response)。否则request不会交给后面的Filter或者Servlet.
Filter需要配置在web.xml中才能生效。一个Filter需要配置<filter>与<filter-mapping>标签,例如:
<filter>
  
  <filter-name>filterName</filter-name>
  <filter-class>com.wang.indentity.myFilter</filter-class>
  </filter>
  
  <filter-mapping>
  <filter-name>filterName</filter-name>
  <url-pattern>*.action</url-pattern>
  <dispatcher>REQUEST</dispatcher>
  </filter-mapping>
<filter>配置Filter名称,实现类以及初始化参数(如果有的话),可同时配置多个初始化参数。<filter-mapping>配置什么规则下使用该Filter。<filter>的filterName与<filter-mapping>的filterName必须匹配。
<url-pattern>配置URL的规则,可以配置多个,可以使用通配符(*).例如"/jsp/*"适用于本contextPath下以"/jsp/"开头的Servlet路径,"*.do"适用于所有以".do"结尾的Servlet路径。
<dispatcher>配置到达Servlet的方式,有4种取值:REQUEST/FORWARD/INCLUDE/ERROR.可以同时配置多个<dispatcher>。如果没有配置任何<dispatcher>,默认为REQUEST。区别如下:
REQUEST:表示仅当直接请求Servlet时才生效
FORWARD:表示仅当某Servlet通过FORWARD到该Servlet时才生效。
INCLUDE:jsp中可以通过<jsp:include/>请求某Servlet。仅这种情况下有效。
ERROR:jsp中可以通过<%@ page errorPage="error.jsp" %>指定错误处理页面。仅在这种情况下才生效。
<url-pattern>与<diapatcher>的关系是"且"的关系。只有满足<url-pattern>的条件,且满足<dispatcher>的条件时,该filter才能生效。
提示:一个web程序可以配置多个Filter,这多个Filter的执行顺序有先后。规则是<filter-mapping>配置在前面的Filter执行要早于配置在后面的Filter.另外要注意,多个Filter可能会相互影响。