概述
过滤器实际上就是对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></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配置详解
可以有四种配置方式:
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配置:依次按照的顺序执行,谁在上面就先执行谁。
扩展:过滤器的执行
解决中文乱码
过滤器通常可以用来做一些通用配置,比如:防止请求或者响应时的中文乱码现象,添加权限的判断等。
package cn.tedu.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/user/*")
public class Filter1 implements Filter {
public void destroy() {
System.out.println("destroyFilter");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("filter1...doFilter");
req.setAttribute("name","jack");
req.setCharacterEncoding("utf-8");//解决请求时的中文乱码
resp.setContentType("text/html;charset=utf8");//解决响应时的中文乱码
chain.doFilter(req, resp);//放行请求,可以继续访问目标资源.否则就会拦截请求
}
public void init(FilterConfig config) throws ServletException {
System.out.println("initFilter");
}
}