Filter过滤器
Posted cgblpx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Filter过滤器相关的知识,希望对你有一定的参考价值。
概述
过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理
通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理
通常用来做一些通用配置,比如:权限验证,登录验证,乱码处理等
入门案例
实现Filter接口,重写一些方法,配置过滤规则
测试
package cn.tedu.filterdemo;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")//拦截所有请求,只要访问这个项目里的资源,全都拦截,不放行就阻塞
public class MyFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("filter上线...");
chain.doFilter(req, resp);//放行,否则就阻塞住了
}
public void init(FilterConfig config) throws ServletException {
}
}
在web.xml里配置过滤器信息
配置过滤器的过滤规则,可以使用注解指定,也可以在web.xml里配置,二选一即可
web.xml内容
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>cn.tedu.filterdemo.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Filter生命周期
Filter的生命周期中,包含着几个方法,不同阶段服务器会调用不同的方法,包括init() destory() doFilter()
测试
package cn.tedu.filterdemo;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class Filter3 implements Filter {
//在服务器启动时,就会自动创建Filter对象,并执行init,通常用来完成项目的初始化,而且只执行1次
public void init(FilterConfig config) throws ServletException {
System.out.println("filter init...");
}
//每次拦截到请求后,都会执行的一些业务逻辑.会执行多次
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("filter doFilter...");
chain.doFilter(req, resp);
}
//服务器正常关闭时会执行,而且只执行1次
public void destroy() {
System.out.println("filter destroy...");
}
}
Filter配置详解
可以有4种配置方式:
1,具体文件: /index.jsp ,是指只有访问index.jsp这一个资源时,过滤器会被执行
2,匹配前缀: /user/* ,是指访问user下的所有资源时,过滤器会被执行
3,匹配后缀: * .jsp, 是指访问所有后缀名为jsp的文件时,过滤器会被执行
4,匹配所有: /* ,是指访问所有资源时,过滤器会被执行
测试
package cn.tedu.filterdemo;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//@WebFilter("/hello1.html") //只拦截固定资源
//@WebFilter("/user/*") //按照请求前缀拦截
//@WebFilter("*.jsp") //按照请求后缀拦截
@WebFilter("/*") //啥都拦截
public class Filter4 implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("filter doFilter....");
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
FilterChain过滤器链
执行顺序:
有多个过滤器配置时,依次按照:
过滤器1
过滤器2
执行资源
过滤器2
过滤器1
过滤器的先后顺序
注解配置: 哪个过滤器将会先被执行,会按照类名的字符串比较规则,较小的先执行.如: AFilter先于BFilter执行,Filter3先于Filter4执行
web.xml配置: 依次按照的顺序执行,谁在上面就先执行谁
以上是关于Filter过滤器的主要内容,如果未能解决你的问题,请参考以下文章