目录
快速入门
什么是Filter
Filter表示过滤器,是 JavaWeb三大组件(Servlet、Filter、Listener)之一。
有什么作用
可以拦截请求资源,实现业务逻辑,用于一些通用的操作,如日志输出,登录校验等
写一个demo快速上手(基于springboot)
思路分析:
1.定义一个类实现Filter接口,并重写所有方法
2.加上@WebFilter注解,用于指定拦截资源的路径
3.启动类上加上@ServletComponentScan(表示对Servlet组件支持)
代码实现
@WebFilter(urlPatterns = "/*") //配置过滤器要拦截的请求路径( /* 表示拦截浏览器的所有请求 )
public class DemoFilter implements Filter {
@Override //初始化方法, 只调用一次
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init 初始化方法执行了");
}
@Override //拦截到请求之后调用, 调用多次
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("Demo 拦截到了请求...放行前逻辑");
//放行
chain.doFilter(request,response);
}
@Override //销毁方法, 只调用一次
public void destroy() {
System.out.println("destroy 销毁方法执行了");
}
}
1.对三种方法进行解析:init()方法是初始化方法,在web服务器启动的时候,就初始化了,会自动创建过滤器对象,这个方法只会调用一次
destroy()方法则是销毁方法,关闭web服务器的时候会被自动调用,也只会调用一次
doFilter()方法是需要重点掌握的方法,一般我们也只会重写这个方法,它是每次拦截到一次指定的请求都会被调用一次
2.当添加注解@WebFilter并指定属性urlPatterns 的时候,Filter才会真正的生效通过urlPatterns属性指定要拦截哪些请求
3.而对于SpringBoot工程,我们还必须在启动类上加@ServletComponentScan注解才可以使过滤器生效,通过这个@ServletComponentScan注解来开启SpringBoot项目对于Servlet组件的支持。
@ServletComponentScan
@SpringBootApplication
public class TliasWebManagementApplication {
public static void main(String[] args) {
SpringApplication.run(TliasWebManagementApplication.class, args);
}
}
注意事项
在过滤器Filter中,如果不执行chain.doFilter(request, response)这个方法将无法访问后面的资源,这个一个放行操作
Filter使用细节
执行流程图解
当我们拦截到请求后我们会进入到过滤器的doFilter()方法,根据需要在这个方法中执行放行前的逻辑,和放行后的逻辑
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("DemoFilter 放行前逻辑.....");//只是demo,具体写自己需要的代码逻辑
//放行请求
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("DemoFilter 放行后逻辑.....");//只是demo,具体写自己需要的代码逻辑
}
拦截路径
1.拦截具体路径(urlPatterns值 /login)
2.拦截目录(urlPatterns值 /emps/*)
3.拦截所有(urlPatterns值 /*)
过滤器链
当我们有多个过滤器的时候,就会形成过滤器链,如下图
比如:我们在web服务器定义了两个或者以上的过滤器就会形成过滤器链,这两个过滤器会依次执行(执行顺序根据过滤器类名的首字母自然排序),会先执行第一个Filter,放行之后再来执行第二个Filter,如果执行到了最后一个过滤器放行之后,才会访问对应的web资源。
简单验证
在我们上面的过滤器模拟的基础上我们再写一个过滤器AbcFilter,体会一下过滤器链中的执行顺序
**AbcFilter过滤器**具体代码
@WebFilter(urlPatterns = "/*")
public class AbcFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("Abc 拦截到了请求... 放行前逻辑");
//放行
chain.doFilter(request,response);
System.out.println("Abc 拦截到了请求... 放行后逻辑");
}
}
**DemoFilter过滤器**具体代码
@WebFilter(urlPatterns = "/*")
public class DemoFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("DemoFilter 放行前逻辑.....");
//放行请求
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("DemoFilter 放行后逻辑.....");
}
}
查看日志输出
注意:过滤器的执行顺序和类名有关系。以注解方式配置的Filter过滤器,它的执行优先级是按时过滤器类名的自动排序确定的,类名排名越靠前,优先级越高。
未完待续.........