周振林 周振林
首页
  • 前端文章

    • HTML
    • CSS
    • Tailwind CSS (opens new window)
    • JavaScript
    • Vue3
    • 其他
  • 学习笔记

    • 《JavaScript教程》
    • 《ES6 教程》
    • 《TypeScript》
    • 《Vue》
    • 《Git》
    • 《小程序笔记》
    • 《JS设计模式总结笔记》
  • 规范
  • Spring
  • 安装教程
  • 其他教程
  • 归真医学
  • 常用药材
  • 学习笔记
  • 经方学习心得
  • 基础
  • 虚拟化
  • Docker
  • OpenStack
  • 心情杂货
关于
收藏
  • 分类
  • 标签
  • 归档

周振林

IT界的小学生
首页
  • 前端文章

    • HTML
    • CSS
    • Tailwind CSS (opens new window)
    • JavaScript
    • Vue3
    • 其他
  • 学习笔记

    • 《JavaScript教程》
    • 《ES6 教程》
    • 《TypeScript》
    • 《Vue》
    • 《Git》
    • 《小程序笔记》
    • 《JS设计模式总结笔记》
  • 规范
  • Spring
  • 安装教程
  • 其他教程
  • 归真医学
  • 常用药材
  • 学习笔记
  • 经方学习心得
  • 基础
  • 虚拟化
  • Docker
  • OpenStack
  • 心情杂货
关于
收藏
  • 分类
  • 标签
  • 归档
  • 规范

  • Spring

    • Spring基础
    • Spring IoC
    • Spring AOP
    • SpringBoot异常
    • SpringBoot过滤器
      • Spring Filter 过滤器
        • Filter 介绍
        • Filter是如何实现拦截的?
        • 如何自定义Filter
        • 1.自己手动注册配置实现
        • 2.通过些注解实现过滤器
    • SpringBoot拦截器
    • Response设置响应编码
    • 依赖start和依赖BOM区别
    • Thymeleaf教程
  • 安装教程

  • 其他教程

  • 后端
  • Spring
周振林
2024-05-22
目录

SpringBoot过滤器

# Spring Filter 过滤器

# Filter 介绍

Filter 过滤器这个概念应该大家不会陌生,特别是对与从 Servlet 开始入门学 Java 后台的同学来说。那么这个东西我们能做什么呢?Filter 过滤器主要是用来过滤用户请求的,它允许我们对用户请求进行前置处理和后置处理,比如实现 URL 级别的权限控制、过滤非法请求等等。Filter 过滤器是面向切面编程——AOP 的具体实现(AOP切面编程只是一种编程思想而已)。

另外,Filter 是依赖于 Servlet 容器,Filter接口就在 Servlet 包下面,属于 Servlet 规范的一部分。所以,很多时候我们也称其为“增强版 Servlet”。

如果我们需要自定义 Filter 的话非常简单,只需要实现 javax.Servlet.Filter 接口,然后重写里面的 3 个方法即可!

Filter.java

public interface Filter {
  
   //初始化过滤器后执行的操作
    default void init(FilterConfig filterConfig) throws ServletException {
    }
		
   // 对请求进行过滤
    void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
   
	 // 销毁过滤器后执行的操作,主要用户对某些资源的回收
    default void destroy() {
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# Filter是如何实现拦截的?

Filter接口中有一个叫做 doFilter 的方法,这个方法实现了对用户请求的过滤。具体流程大体是这样的:

用户发送请求到 web 服务器,请求会先到过滤器; 过滤器会对请求进行一些处理比如过滤请求的参数、修改返回给客户端的 response 的内容、判断是否让用户访问该接口等等。 用户请求响应完毕。 进行一些自己想要的其他操作。

doca16b3341d0d941d5bbe7ad972ec3cabf.png

# 如何自定义Filter

下面提供两种方法。

# 1.自己手动注册配置实现

自定义的 Filter 需要实现javax.Servlet.Filter接口,并重写接口中定义的3个方法。

FirstFilter


@Component
public class FirstFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);

        System.out.println("初始化firstFilter.............");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //执行之前进行的操作
        HttpServletRequest request=(HttpServletRequest) servletRequest;
        String uri=request.getRequestURI();
        System.out.println("firstFilter请求之前,请求uri:"+uri);
        Long start=System.currentTimeMillis();

//        servletResponse.getWriter().println("exit");

        //执行用户请求
        filterChain.doFilter(servletRequest,servletResponse);

        //执行完请求之后进行的操作

        Long end=System.currentTimeMillis();
        System.out.println("firstFilter请求之后,请求执行时间:"+(end-start));

    }

    @Override
    public void destroy() {
        Filter.super.destroy();

        System.out.println("销毁过滤器.................");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

如果不需要用户往下执行请求接口,则不需要执行filterChain.doFilter(servletRequest,servletResponse);在这之前直接通过servletResponse.getWriter().println("");返回结果即可。

在配置中注册自定义的过滤器。

AppConfiguration

@Data
@Configuration
public class AppConfiguration {

    private final FirstFilter firstFilter;

    @Bean
    public FilterRegistrationBean firstFilter1(){
        FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean();
        filterRegistrationBean.setFilter(firstFilter);
				//设置过滤器执行顺序
				filterRegistrationBean.setOrder(1);
        filterRegistrationBean.addUrlPatterns("/api/*");

        return filterRegistrationBean;
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 2.通过些注解实现过滤器

SecondFilter

@Component
@WebFilter(filterName = "secondFilter",urlPatterns = "/api/*")
public class SecondFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
        System.out.println("初始化secondFilter。。。。。");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("secondFilter请求之前");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("secondFilter请求之后");
    }

    @Override
    public void destroy() {
        Filter.super.destroy();

        System.out.println("secondFilter销毁。。。。。");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

自定义 Controller 验证过滤器

HelloController

@RestController
@RequestMapping("/api")
public class HelloController {


    @RequestMapping("/hello")
    public Object hello() throws InterruptedException {

        Thread.sleep(2000);
        return "Hello World!";
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13

源码地址 (opens new window)

Last Updated: 2024/07/26, 16:12:04
SpringBoot异常
SpringBoot拦截器

← SpringBoot异常 SpringBoot拦截器→

最近更新
01
Docker安装
06-10
02
Docker运行JAR
06-10
03
Docker部署MySQL
06-10
更多文章>
Copyright © 2019-2025 鲁ICP备19032096号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式