一、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);
      }
      }

Spring Boot 自定义Filter的更多相关文章

  1. Spring Boot自定义starter必知必会条件

    前言 在目前的Spring Boot框架中,不管是Spring Boot官方还是非官方,都提供了非常多的starter系列组件,助力开发者在企业应用中的开发,提升研发人员的工作效率,Spring Bo ...

  2. spring boot自定义线程池以及异步处理

    spring boot自定义线程池以及异步处理@Async:什么是线程池?线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程.每个线程都使 ...

  3. Spring Boot自定义配置与加载

    Spring Boot自定义配置与加载 application.properties主要用来配置数据库连接.日志相关配置等.除了这些配置内容之外,还可以自定义一些配置项,如: my.config.ms ...

  4. Spring Boot 2.X(四):Spring Boot 自定义 Web MVC 配置

    0.准备 Spring Boot 不仅提供了相当简单使用的自动配置功能,而且开放了非常自由灵活的配置类.Spring MVC 为我们提供了 WebMvcConfigurationSupport 类和一 ...

  5. Spring Boot自定义Redis缓存配置,保存value格式JSON字符串

    Spring Boot自定义Redis缓存,保存格式JSON字符串 部分内容转自 https://blog.csdn.net/caojidasabi/article/details/83059642 ...

  6. 玩转Spring Boot 自定义配置、导入XML配置与外部化配置

    玩转Spring Boot 自定义配置.导入XML配置与外部化配置       在这里我会全面介绍在Spring Boot里面如何自定义配置,更改Spring Boot默认的配置,以及介绍各配置的优先 ...

  7. 解决Spring Security自定义filter重复执行问题

    今天做项目的时候,发现每次拦截器日志都会打两遍,很纳闷,怀疑是Filter被执行了两遍.结果debug之后发现还真是!记录一下这个神奇的BUG! 问题描述 项目中使用的是Spring-security ...

  8. 峰哥说技术:06-手撸Spring Boot自定义启动器,解密Spring Boot自动化配置原理

    Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 06  峰哥说技术:手撸Spring Boot自定义启动器,解密Spring Boot自动化配置原理 Sp ...

  9. Spring Boot 自定义kafka 消费者配置 ContainerFactory最佳实践

    Spring Boot 自定义kafka 消费者配置 ContainerFactory最佳实践 本篇博文主要提供一个在 SpringBoot 中自定义 kafka配置的实践,想象这样一个场景:你的系统 ...

随机推荐

  1. 使用sessionStorage获取值和设置值

    <body><button id="btn1">设置值</button><button id="btn2">获取 ...

  2. 物理像素[设备像素] & 逻辑像素[CSS像素];

    为什么移动端CSS里面写了1px,实际上看起来比1px粗 了解设备物理像素和逻辑像素的同学应该很容易理解,其实这两个px的含义其实是不一样的, UI设计师要求的1px是指设备的物理像素1px,而CSS ...

  3. 面向对象程序设计(JAVA) 第15周学习指导及要求

    2019面向对象程序设计(Java) 第15周学习指导及要求(2019.12.6-2019.12.13)   学习目标 (1) 掌握菜单组件用途及常用API: (2) 掌握对话框组件用途及常用API: ...

  4. JMeter基础知识系列三

    JMeter测试结果字段的意义: Label:定义HTTP请求名称. Samples:表示这次测试中一共发出了多少个请求. Average:平均响应时长,当使用了Transaction Control ...

  5. 使用 github pages快速部署自己的静态网页

    看见很多大神在Github Pages上部署Demo,感觉效果还不错,刚才自己也试了一下,发现其实并不难! 选择 github pages 的理由 使用零成本: github pages 集成在 gi ...

  6. Nginx之负载均衡 :两台服务器均衡(填坑)

    第一步,两台服务器都要安装好Nginx和Tomcat,我这边的安装的是Nginx 1.16.1 Tomcat9: 第二步,安装完成之后,选择你要做均衡的那台服务器,,打开其Nginx 配置文件,在se ...

  7. 《js高程》笔记总结二(变量,作用域,内存问题)

    理解基本类型和引用类型的值,理解执行环境,理解垃圾收集 基本类型的值和引用类型的值 基本类型:简单的数据段,引用类型:指可能由多个值构成的对象(在将一个值赋值的时候,解析器必须知道这个值是基本类型值还 ...

  8. Linux内核驱动之GPIO子系统API接口概述

    1.前言 在嵌入式Linux开发中,对嵌入式SoC中的GPIO进行控制非常重要,Linux内核中提供了GPIO子系统,驱动开发者在驱动代码中使用GPIO子系统提供的API函数,便可以达到对GPIO控制 ...

  9. ASP.NET ---- Repeater 遍历出省市

    Repeater  控件可以数据库中的数据,一条条的查找出,不需要后端在进行遍历输出了, Repeater必须使用的是Itemtemplate,其它的类型模板按需添加,主要记住Itemtemplate ...

  10. SLB外部端口非80时---》转发到nginx---》URL跳转丢失端口的解决方案

    配置nginx反向代理时遇到一个问题,当设置nginx监听80端口时转发请求没有问题.但一旦设置为监听其他端口,就一直跳转不正常: 如,访问欢迎页面时应该是重定向到登录页面,在这个重定向的过程中端口丢 ...