Java Web中的Filter

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

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

 

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

1.创建过滤器执行类

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

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

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

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

实例:

 

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后

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值