SpringBoot过滤器的实现

1、过滤器与拦截器的区别

①:拦截器是基于java的反射机制的,而过滤器是基于函数的回调。
②:拦截器不依赖于servlet容器,而过滤器依赖于servlet容器。
③:拦截器只对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④:拦截器可以访问action上下文、值、栈里面的对象,而过滤器不可以。
⑤:在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥:拦截器可以获取IOC容器中的各个bean,而过滤器不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

2、过滤器的调用

过滤器是在前端向controller层发请求之前被调用
过滤器的调用分为三个步骤,
init : filter对象只会创建一次,init方法也只会执行一次。

doFilter : 主要的业务代码编写方法,可以多次重复调用
destroy : 在销毁Filter时自动调用(程序关闭或者主动销毁Filter)
其中doFilter的调用最为主要。
 

 

3、过滤器的设置规则

@Order(1):表示过滤器的顺序,假设我们有多个过滤器,你如何确定过滤器的执行顺序?这个注解就是规定过滤器的顺序。
如果不指定Order的话,会默认按照filterName的首字母(A、B、C...Z)进行排序;
注意:
启动类中增加注解,自动注册Filter

@ServletComponentScan :在SpringBootApplication上使用@ServletComponentScan注解后,

Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码。

4、过滤器的实现

 

4.1、过滤器的引入

引入spring-boot-starter-web 在pom.xml 中引入spring-boot-starter-web包。

<dependency>             
  <groupId>org.springframework.boot</groupId>             
  <artifactId>spring-boot-starter-web</artifactId>         
</dependency>

4.2过滤器的建立

这里需要注意的是,urlPatterns是需要过滤的请求地址,这里我写的是urlPatterns = "/staff/info/*,
那这个过滤器过滤的是RequestMapping=@RequestMapping("/staff/info")下面的所有方法,
也就是一个controller层,如果想过滤所有数据就这样写:urlPatterns = "/*。
  
 1 import javax.servlet.*;
 2 import javax.servlet.annotation.WebFilter;
 3 import javax.servlet.http.HttpServletRequest;
 4 import javax.servlet.http.HttpServletResponse;
 5 import java.io.IOException;
 6 
 7 // 定义filterName 和过滤的url
 8 @WebFilter(filterName = "myFilter" ,urlPatterns = "/staff/info/*")
 9 public class CommonFilterAnnotation implements Filter {
10          /**
11      * filter对象只会创建一次,init方法也只会执行一次。
12      * @param filterConfig
13      * @throws ServletException
14      */
15     @Override
16     public void init(FilterConfig filterConfig) throws ServletException {
17         System.out.println("CommonFilterAnnotation初始化完成....");
18     }
19     /**
20      * 主要的业务代码编写方法
21      * @param servletRequest
22      * @param servletResponse
23      * @param filterChain
24      * @throws IOException
25      * @throws ServletException
26      */
27     @Override
28     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
29             throws IOException, ServletException {
30         System.out.println("啦啦啦");
31         //获取session中保存的对象
32         HttpServletRequest req = (HttpServletRequest) request;
33         HttpServletResponse resp = (HttpServletResponse) response;
34 
35         //获取请求路径
36         String servletPath = req.getServletPath();
37         System.out.println( "servletPath = " + servletPath );
38 
39         if (servletPath.equals( "/staff/info/upload" )){
40             String path = "/staff/info/photo";
41             //改变前端请求的后端路径为path
42             req.getRequestDispatcher(path).forward(req,resp);
43             //放行
44             chain.doFilter( req,resp);
45             return;
46         }
47         //放行请求
48         chain.doFilter(request,response);
49 
50     }
51     /**
52      * 在销毁Filter时自动调用。
53      */
54     @Override
55     public void destroy() {
56         Filter.super.destroy();
57     }
58 }

 

 
posted @ 2022-11-25 09:37  繁星学习中心  阅读(707)  评论(0编辑  收藏  举报