SpringBoot整合过滤器

通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理

创建过滤器类实现Filter接口

package com.gateway.springcloudgatewayservice.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * @author gf
 * @date 2023/2/3
 */
public class FilterTest implements Filter {

    /**
     * init方法,初始化过滤器,可以在init()方法中完成与构造方法类似的初始化功能,
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
        System.out.println("FilterTest过滤器成功初始化。。。。。。。。。。。。。");
    }

    /**
     * 过滤器初始化后并在请求到达后端且进入到注册过滤器设置的匹配路径时回调。
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        //这里为了使用getHeader方法获取token,转型成HttpServletRequest
        System.out.println("FilterTest过滤器");
        System.out.println("token:"+req.getHeader("token"));
        String token = req.getHeader("token");
        //再判断token是否正确
        if(null==token){
            throw new RuntimeException("token为空");
        }
        //调用doFilter方法,正常返回servletResponse
        filterChain.doFilter(servletRequest, servletResponse);
    }

    /**
     * 过滤器销毁时回调。
     */
    @Override
    public void destroy() {
        Filter.super.destroy();
        System.out.println("过滤器被销毁");
    }
}

实现servlet的Filter接口,并重写他的三个方法,分别是init,doFilter,destroy。

上图是一个简单实现token校验是否为空,没有进行正确与否的校验,从request中获取token头,若存在则调用doFilter方法(通过过滤器),否则不作操作(就是不通过过滤器,不会抵达controller)。

将自定义过滤器注册到容器中,通过FilterRegistrationBean的一系列方法设置过滤器的参数,例如需要过滤的路径,过滤器的优先级等等。

package com.gateway.springcloudgatewayservice.filter;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author gf
 * @date 2023/2/3
 */
@Configuration
public class TestFilterConfig {
    @Bean
    public FilterRegistrationBean filterRegistrationBean(){
        //创建一个注册过滤器对象
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        //设置自定义过滤器
        registrationBean.setFilter(new FilterTest());
        //设置过滤拦截匹配规则,/*是匹配所有
//        registrationBean.addUrlPatterns("/*");
        //只拦截test下面的接口
        registrationBean.addUrlPatterns("/test/*");
        //存在多个过滤器时,设置执行顺序,值越大,执行顺序越靠后
        registrationBean.setOrder(2);
        //返回这个注册过滤器对象
        return registrationBean;
    }
}

创建测试方法

    @GetMapping("/test")
    public BaseResponse sayHello(@RequestParam("name") String name){
        if(!name.equals("老王")){
            throw new BaseException(BaseErrorEnum.USER_NOT_EXIST);
        }
        else{
            return RespGenerator.success("调用成功");
        }
    }

postman测试不带token的效果

可以看到,由于token为空,请求被拦截了

postman测试带token的效果

可以看到请求成功,没有被拦截

在一个项目中我们可能会存在多个过滤器,那如何来设置过滤器的执行顺序呢?

重复1,2步骤,重新创建一个过滤器,第一个设置Order参数为2,第二个设置为1

然后请求接口,查看执行顺序

从结果来看,Order越大,越往后执行,说明Order的值越小,优先级越高

Original: https://blog.csdn.net/qq_44936392/article/details/128871893
Author: 泡面五分熟
Title: SpringBoot整合过滤器

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/818178/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球