1.解释:过滤器,其实顾名思义,就是起到过滤的作用,比如生活中的空气净化器,净水器等,过滤出想要的东西。那么反应在程序中其实就是请求过来之后,可以拦截下来,通过自己的业务逻辑设计,让一些符合规则条件的请求过去,而不符合的就拦截,常见的例如:登录验证功能,敏感词汇替换过滤等。
2.步骤:
创建一个类实现Filter接口
复写方法
配置拦截路径
(1)注解方式:@WebFilter("/*") 表示访问时,所有资源都执行该过滤器
还可以设置dispatcherTypes属性
1. REQUEST:默认值。浏览器直接请求资源
2. FORWARD:转发访问资源
3. INCLUDE:包含访问资源
4. ERROR:错误跳转资源
5. ASYNC:异步访问资源
@WebFilter(value = "/*",dispatcherTypes = DispatcherType.REQUEST)
package cn.itcast.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class LoginFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("进来了");
//可以写一些自己的过滤逻辑后选择是否放行
//放行
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
(2)xml配置
在web.xml中设置:
<filter>
<filter-name>demo1</filter-name>
<filter-class>cn.itcast.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.过滤器执行流程
(1). 执行过滤器
(2). 执行放行后的资源
(3). 回来执行过滤器放行代码下边的代码
4.过滤器生命周期方法
(1) init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
(2) doFilter:每一次请求被拦截资源时,会执行。执行多次
(3) destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
5 拦截路径配置:
- 具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
- 拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行
- 后缀名拦截: *.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
- 拦截所有资源:/* 访问所有资源时,过滤器都会被执行
6.过滤器先后顺序问题:
1. 注解配置:按照类名的字符串比较规则比较,值小的先执行
* 如: AFilter 和 BFilter,AFilter就先执行了。
2. web.xml配置: 谁定义在上边,谁先执行