Filter 表示过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一.过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。
过滤器一般完成一些通用的操作。比如每个资源都要写一些代码完成某个功能,我们总不能在每个资源中写这样的代码吧, 而此时我们可以将这些代码写在过滤器中,因为请求每一个资源都要经过过滤器。
创建第一个Filter
定义类,实现 Filter接口,并重写其所有方法 ,配置Filter拦截资源的路径:在类上定义 @WebFilter 注解。而注解的 value 属性值 /* 表示拦截所有的资源。在doFilter方法中输出一句话,并放行
- package com.chen.filter;
-
- import javax.servlet.*;
- import javax.servlet.annotation.WebFilter;
- import java.io.IOException;
-
- @WebFilter("/*")
- public class FilterDemo implements Filter {
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
-
- }
- @Override
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
- System.out.println("放行前逻辑被执行");
- //放行前一般对request进行处理
- filterChain.doFilter(servletRequest,servletResponse);//放行
- System.out.println("放行后逻辑被执行");
- //放行后对request进行处理
- }
- @Override
- public void destroy() {
-
- }
- }
执行流程
放行后访问对应资源,资源访问完成后,还会回到Filter中吗?
从上图就可以看出肯定 会 回到Filter中
如果回到Filter中,是重头执行还是执行放行后的逻辑呢?
如果是重头执行的话,就意味着 放行前逻辑 会被执行两次,肯定不会这样设计了;所以访问完资源后,会回到 放行后逻 辑 ,执行该部分代码。
Filter拦截路径配置 拦截路径表示 Filter 会对请求的哪些资源进行拦截,使用 @WebFilter 注解进行配置。如: @WebFilter("拦截路径") 拦截路径有如下四种配置方式:
拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截
目录拦截:/user/*:访问/user下的所有资源,都会被拦截
后缀名拦截:*.jsp:访问后缀名为jsp的资源,都会被拦截
拦截所有:/*:访问所有资源,都会被拦截
拦截路径的配置方式和 Servlet 的请求资源路径配置方式一样,但是表示的含义不 同。
过滤器链是指在一个Web应用,可以配置多个过滤器,这多个过滤器称为过滤器链。
注解配置的filter,执行的顺序,是按类名的排序顺序。比如的过滤器类名为A,那一定会比类名为B的过滤器执行的要先