• Spring Boot 自定义Filter


    一、Filter功能

    它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个 “servlet chaining” (servlet 链).

    一个Filter包括:
    1)、在servlet被调用之前截获;
    2)、在servlet被调用之前检查servlet request;
    3)、根据需要修改request头和request数据;
    4)、根据需要修改response头和response数据;
    5)、在servlet被调用之后截获.

    二、自定义Filter

    • 方法一:
    1. 实现filter方法

      public class GlobalFilter implements Filter {
          @Override
          public void init(FilterConfig filterConfig) throws ServletException {
      
          }
      
          @Override
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
              HttpServletRequest request = (HttpServletRequest) servletRequest;
              String requestURI = request.getRequestURI();
              System.out.println(requestURI);
              filterChain.doFilter(request, servletResponse);
          }
      
          @Override
          public void destroy() {
      
          }
      }
      
    2. 加载Filter 配置

      @Configuration
      public class FilterConfig {
      
          @Bean
          public FilterRegistrationBean filterRegistration(){
              // 新建过滤器注册类
              FilterRegistrationBean registration = new FilterRegistrationBean();
              // 添加自定义 过滤器
              registration.setFilter(globalFilter());
              // 设置过滤器的URL模式
              registration.addUrlPatterns("/*");
              //设置过滤器顺序
              registration.setOrder(1);
              return registration;
          }
          @Bean
          public GlobalFilter globalFilter(){
              return new GlobalFilter();
          }
      }	
      
    • 方法二(推荐)

      1. 自定义MyFilter, 如果请求URI 包含 my , 则进行下一步处理

        @WebFilter(filterName = "myFilter", urlPatterns = "/*")
        public class MyFilter implements Filter {
        
            @Override
            public void init(FilterConfig filterConfig) throws ServletException {
                System.out.println("init...");
            }
        
            @Override
            public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
                HttpServletRequest request = (HttpServletRequest) servletRequest;
                String requestURI = request.getRequestURI();
                if(requestURI.contains("my")){
                    System.out.println("成功啦。。。, 请求URI是:" + requestURI);
                }
                filterChain.doFilter(request, servletResponse);
            }
        
            @Override
            public void destroy() {
                System.out.println("destroy...");
            }
        }
        
      2. 在Application 启动类 添加 @ServletComponentScan 注解

        @ServletComponentScan
        @SpringBootApplication
        public class Application {
        
            public static void main(String[] args) {
                SpringApplication.run(Application.class, args);
            }
        }
        


    作者:关小涛
    学习和分享是博客最大的乐趣,欢迎大家取之所需。
    努力是自己努力的原因,每周天写博客总结工作中的新技能和出现的问题
  • 相关阅读:
    阿里P8架构师谈:阿里双11秒杀系统如何设计?
    秒杀系统设计的知识点
    秒杀系统架构优化思路
    秒杀系统解决方案
    Entity Framework Code First (七)空间数据类型 Spatial Data Types
    Entity Framework Code First (六)存储过程
    Entity Framework Code First (五)Fluent API
    Entity Framework Code First (四)Fluent API
    Entity Framework Code First (三)Data Annotations
    Entity Framework Code First (二)Custom Conventions
  • 原文地址:https://www.cnblogs.com/XtsLife/p/11383842.html
Copyright © 2020-2023  润新知