Java Web中的Filter_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Java Web中的Filter

Java Web中的Filter

 2013/11/16 3:32:59  满月不满  程序员俱乐部  我要评论(0)
  • 摘要:Filter:Javaweb项目中的过滤器,可以过滤用户的请求,对请求进行预处理和后置处理。打个比方来说,过滤器类似于门卫大爷。如果没有门卫,邮件会直接交到收件人的手里。现在,邮件必须要先经过大爷的手,如果大爷觉得楼里有这个收件人,就先给收件人打个电话,等于预先处理一下,然后把邮件给他,如果大爷觉得没有这个人(不符合规则),或者觉得这个人平时很讨厌,就直接说,没这个收件人,赶紧拿走。收件人拿走邮件之后,大爷可能要登记一下,这就是后续操作。那么,如何在项目中配置一个门卫大爷呢?一共需要两步:1
  • 标签:Web Java

Filter:Java web项目中的过滤器,可以过滤用户的请求,对请求进行预处理和后置处理。

? ? ? ?打个比方来说,过滤器类似于门卫大爷。如果没有门卫,邮件会直接交到收件人的手里。现在,邮件必须要先经过大爷的手,如果大爷觉得楼里有这个收件人,就先给收件人打个电话,等于预先处理一下,然后把邮件给他,如果大爷觉得没有这个人(不符合规则),或者觉得这个人平时很讨厌,就直接说,没这个收件人,赶紧拿走。收件人拿走邮件之后,大爷可能要登记一下,这就是后续操作。

?

那么,如何在项目中配置一个门卫大爷呢?一共需要两步:

1.创建过滤器执行类

? ? ? ?过滤器必须实现Filter接口,接口中有三个方法:

init() :初始化过滤器,容器初始化时执行,只执行一次

doFilter() :执行过滤器,过滤器中最重要的方法,所有的逻辑都在这里体现,这里面最重要的一行代码是chain.doFilter();表示请求向下进行

destroy():销毁过滤器,同init()一样,只会执行一次

实例:

?

class="java" name="code">public class TestFliter implements Filter {
	
	private FilterConfig config;
	
	@Override
	public void init(FilterConfig config) throws ServletException {
		this.config = config;
		System.out.println("初始化过滤器  ");
	}
	
	@Override
	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
                //执行前置处理
		System.out.println("执行前置处理");  
                //执行目标请求  
		chain.doFilter(req, resp);     
                System.out.println("执行后置处理"); 
	}

	@Override
	public void destroy() {
		System.out.println("销毁过滤器  ");
	}
	
}

?输出顺序为:

?

初始化过滤器
执行前置方法
执行后置方法
销毁过滤器

? ? 如果请求资源为doServlet,那么执行顺序为 “执行前置方法”->请求doSerlvet->“请求后置方法”

?

2.在web.xml中注册过滤器

? ? 必须在容器中注册过滤器,才能使过滤器生效

<filter>
	<description>测试</description>
	<display-name>测试</display-name>
	<filter-name>test</filter-name>
	<filter-class>framework.web.filter.TestFilter</filter-class>
</filter>
<filter-mapping>
        <filter-name>test</filter-name>
	<url-pattern>*</url-pattern>
        <dispacther>REQUEST</dispacther>
        <dispacther>FORWARD</dispacther>
        <dispacther>INCLUDE</dispacther>
        <dispacther>ERROR</dispacther>
</filter-mapping>

?解释:

filter:定义过滤器

<description>:过滤器描述

<display-name>:显示名称

<filter-name>:过滤器名称(过滤器的唯一标志)

<filter-class>:过滤器类完整类名

?

filter-mapping:映射过滤器到指定资源上

<filter-name>:对应filter中的filter-name

<url-pattern>:资源路径,*表示全部

<dispatcher>:过滤请求类型,共有四种,一个映射中可以有多种

? ? REQUEST:直接来自浏览器的请求(默认类型)

? ? FORWARD:转发过来的请求,如在servlet中调用request.getDispatcher("路径").forward();

? ? INCLIUDE:在页面中使用include标签或在Servlet中调用request.getDispatcher("路径").include();

? ? ?ERROR:使用error-page标签发出的请求

?

多个Filter可以形成过滤器链,在web.xml中若配置了三个过滤器,顺序为a、b、c,当某个请求符合三个filter的url-pattern时,执行顺序为:

a前 -> b前 -> c前 -> 请求资源 -> c后 -> b后 -> a后

?

发表评论
用户名: 匿名