SpringBoot 过滤器

简介

SpringBoot过滤器在web开发中可以过滤指定的URL,比如拦截掉不需要的接口请求,同时也可以对request和response的内容进行修改。

使用场景

SpringBoot过滤器的应用场景:

  1. 过滤敏感词汇,防止SQL注入
  2. 设置字符编码
  3. URL级别的权限访问控制

创建SpringBoot过滤器主要有两种方式,分别:1、实现Filter接口+向spring容器注册filter,2、实现Filter接口+@WebFilter注解

1、Filter接口+向spring容器注册filter

Filter过滤器具体实现类

新建一个AuthFilter过滤器实现类,该类需要实现Filter类,如下:

@Component
public class AuthFilter implements Filter {

    /**
     * 过滤白名单
     */
    private static List<String> WHITE_URL = new ArrayList<>();

    static {
        WHITE_URL.add("/auth");
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("创建AuthFilter");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("执行AuthFilter");
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        if(WHITE_URL.contains(request.getRequestURI())){
            System.out.println("这是请求白名单,直接放行....");
            filterChain.doFilter(servletRequest, servletResponse);
          	return;
        }
        System.out.println("无登录态,跳转到Auth页面。。。");
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        // 路由跳转
        request.getRequestDispatcher("/auth/unauth").forward(request, response);
    }

    @Override
    public void destroy() {
        System.out.println("销毁AuthFilter");
    }
}

向Spring容器中注册Filter

@Configuration
public class FilterConfig {

    @Resource
    private AuthFilter authFilter;

    public FilterRegistrationBean filterRegistrationBean(){
        FilterRegistrationBean registrationBean = new FilterRegistrationBean(authFilter);
        registrationBean.addUrlPatterns("/*");  //需要过滤的URI
        registrationBean.setName("authFilter");
        registrationBean.setOrder(1);
        return registrationBean;
    }

}

2、Filter接口+@WebFilter

Filter过滤器具体实现类

新建一个AuthFilter过滤器实现类,该类需要实现Filter类,并同时在AuthFilter类上标注@WebFilter注解,如下:

@WebFilter(urlPatterns = "/auth/*", filterName = "authFilter")  //需要过滤的URI
public class AuthFilter implements Filter {

    /**
     * 过滤白名单
     */
    private static List<String> WHITE_URL = new ArrayList<>();

    static {
        WHITE_URL.add("/auth");
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("创建AuthFilter");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("执行AuthFilter");
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        if(WHITE_URL.contains(request.getRequestURI())){
            System.out.println("这是请求白名单,直接放行....");
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }
        System.out.println("无登录态,跳转到Auth页面。。。");
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        // 路由跳转
        request.getRequestDispatcher("/auth/unauth").forward(request, response);
    }

    @Override
    public void destroy() {
        System.out.println("销毁AuthFilter");
    }
}

添加@ServletComponentScan注解

需要在启动类中添加@ServletComponentScan注解,如下:

@ServletComponentScan
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

过滤器与拦截器区别

1、拦截器是基于java的反射机制的,而过滤器是基于函数回调。

2、拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

6、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用。而过滤器只需依赖servlet api,不需要依赖spring。

何时使用拦截器?何时使用过滤器

  • 如果是非spring项目,那么拦截器则不可使用,只能使用过滤器
  • 如果是处理controller前后,则既可以使用拦截器也可以使用过滤器
  • 如果是处理dipaterServlet前后,则只可以使用过滤器,像中文乱码问题通常都是使用过滤器实现的

原创文章,作者:jiafegn,如若转载,请注明出处:https://www.techlearn.cn/archives/619

Previous 2023年4月29日
Next 2023年4月30日

相关推荐

  • Springboot 注解 @ConfigurationProperties

    作用 @ConfigurationProperties注解主要作用就是将prefix属性指定的前缀配置项的值绑定到这个Bean上,默认情况下需要和@Component或者@Conf…

    springboot 2022年9月2日
    181
  • SpringBoot 全局异常统一处理

    前言 在实际的项目开发过程中,会有大量的异常发生,而我们并不能将异常信息反馈到用户,所以在返回结果的时候需要对异常进行处理,可是如果在每个Controller返回结果都需要进行异常…

    springboot 2023年4月29日
    125
  • SpringBoot 单元测试

    简介 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库,在 Spring Boot 2.2.0 版本之前,spring-boot-starter…

    springboot 2023年4月2日
    242
  • SpringBoot 整合SpringSecurity认证

    简介 Spring Security 是Spring家族中的一个安全管理框架。相比与另外一个安全框架shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。 —般Web应用的…

    2023年12月31日
    424
  • SpringBoot 打包

    SpringBoot 项目部署到服务器常见的方式就是,打包成 jar 包,通过 nohup java -jar 命令去运行项目,这也是官方推荐的一种方式。 导入依赖 打包 设置打包…

    springboot 2023年4月5日
    148
  • Springboot 注解大全-@Import

    作用 @Import可以用来批量导入需要注册的各种类,如普通的类、配置类,完成普通类和配置类中所有bean注册到spring容器中。作用范围:作用于类、注解 定义 参数 value…

    springboot 2022年8月15日
    184
  • SpringBoot 整合Druid数据源

    简介 Druid是阿里巴巴开源的数据库连接池,号称是Java语言中最好的数据库连接池,能够提供强大的监控和扩展功能。 优点 引入依赖 这里使用的是SpringBoot整合版的Dru…

    2023年3月26日
    168
  • Springboot 注解 @Resource

    作用 和@Autowired注解类似,也是用来注入依赖对象的,spring容器会对bean中所有的字段、方法进行遍历,标注有@Resouce注解的,都会进行注入。@Autowire…

    springboot 2022年9月14日
    269
  • SpringBoot 分布式Session

    简介 现在随着分布式,微服务架构的日益成熟,越来越多的企业将传统的单体服务改造为微服务或是分布式架构,在分布式中就遇到session管理的问题,微服务架构中一个服务为了实现高可用至…

    springboot 2023年4月30日
    176
  • SpringBoot 缓存 – jetcache

    简介 JetCache是一个基于Java的缓存系统封装,提供统一的API和强大的注解来简化缓存的使用。原生支持TTL、两级缓存、分布式自动刷新,还提供了Cache接口用于手工缓存操…

    springboot 2023年4月23日
    336