过滤器

实现过滤器需要实现 javax.servlet.Filter 接口。重写三个方法。其中 init() 方法在服务启动时执行,destroy() 在服务停止之前执行。

可用两种方式注册过滤器:

  • 使用 FilterRegistrationBean 来注入。可使用 setOrder(0) 设置过滤器的优先级,越小优先级越高。
  • 使用 @WebFilter(filterName = "myFilter2" ,urlPatterns = "/*") 配合 @ServletComponentScan() 实现注入。(@Order 注解无效)

编写过滤器

package com.example.recorddemo.filters;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException; public class MyFilter1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化过滤器:" + filterConfig.getFilterName());
} @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("在请求之前做处理"); if (servletRequest instanceof HttpServletRequest) {
System.out.println(" URL:" + ((HttpServletRequest)servletRequest).getRequestURL());
} // 调用filter链中的下一个filter
filterChain.doFilter(servletRequest, servletResponse); System.out.println("在请求之后做处理");
} @Override
public void destroy() {
System.out.println("销毁:MyFilter1");
}
}

注册过滤器

基于 FilterRegistrationBean

在配置类中注册一个 FilterRegistrationBean 类型的Bean。

  • 如果没有设置 UrlPatterns , 那么会自动关联到 /* 上。
  • 如果没有设置过滤器的名字,那么会自动推理出一个过滤器名称(bean的名字)

    When no URL pattern or servlets are specified the filter will be associated to '/*'. The filter name will be deduced if not specified.

  • fileter默认是enable的,将其设置为false表示关闭当前过滤器。
  • 可通过 setOrder(0) 方法设置过滤器的优先级,如果优先级相同,则先定义的优先级更高。
@Configuration
public class FilterConfiguration {
@Bean
public FilterRegistrationBean myFilter1(){
MyFilter1 filter = new MyFilter1();
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(filter);
// filterRegistrationBean.addUrlPatterns("/*");
// filterRegistrationBean.setEnabled(true);
return filterRegistrationBean;
}
}

基于 @WebFilter

  • 使用 @WebFilter 修饰filter。
  • 在任意configuration类中添加 @ServletComponentScan("com.example.recorddemo.filters"),包名可以不填。
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException; @WebFilter(filterName = "myFilter2" ,urlPatterns = "/*")
public class MyFilter2 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {} @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 调用filter链中的下一个filter
filterChain.doFilter(servletRequest, servletResponse); } @Override
public void destroy() {}
}

拦截器

拦截器会在处理指定请求之前和之后进行相关操作,配置拦截器需要两步

    1. 编写拦截器类(实现 HandlerInterceptor 接口)
    1. 添加已实现的拦截器(实现 WebMvcConfigurer 接口,并重写 addInterceptors() 方法)
    1. 添加addPathPatterns()规定拦截哪些请求。(/*表示只拦截/下的所有目录,但是不包括子目录, /**表示拦截/下的所有目录,及其子目录)

拦截器类:

package com.example.recorddemo.interceptor;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* @author wangchao
*/
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// handle可拿到执行方法的反射对象。
System.out.println("preHandle: MyInterceptor");
return true;
} @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 对于RESTful 接口用处不大
} @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 可捕捉异常,但是springboot已经有了全局异常捕捉
}
}

配置拦截器:

package com.example.recorddemo.configuration;

import com.example.recorddemo.interceptor.MyInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import javax.annotation.Resource; /**
* @author wangchao
*/
@Configuration
public class InterceptorConfiguration implements WebMvcConfigurer {
@Resource
MyInterceptor myInterceptor; /**
* 添加拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor).addPathPatterns("/**");
} }

registry.addInterceptor() 方法会返回当前的 interceptor, 因此可直接执行 addPathPatterns() 方法


public InterceptorRegistration addInterceptor(HandlerInterceptor interceptor) {
InterceptorRegistration registration = new InterceptorRegistration(interceptor);
this.registrations.add(registration);
return registration;
}

拦截器的执行顺序类似于栈,按照如下顺序执行:

preHandle-1, preHandle-2, postHandle-2, postHandle-1, afterCompletion-2, afterCompletion-1

SpringBoot 过滤器和拦截器的更多相关文章

  1. Springboot 过滤器和拦截器详解及使用场景

    一.过滤器和拦截器的区别 1.过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的.请求结束返回也是,是在servlet处理完后,返回给前端之前. 2.拦截 ...

  2. springBoot之配置文件的读取以及过滤器和拦截器的使用

    前言 在之前的学习springBoot中,成功的实现了Restful风格的基本服务.但是想将之前的工程作为一个项目来说,那些是仅仅不够的.可能还需要获取自定义的配置以及添加过滤器和拦截器.至于为什么将 ...

  3. springboot(五)过滤器和拦截器

    前言 过滤器和拦截器二者都是AOP编程思想的提现,都能实现诸如权限检查.日志记录等.二者有一定的相似之处,不同的地方在于: Filter是servlet规范,只能用在Web程序中,而拦截器是Sprin ...

  4. springboot配置监听器、过滤器和拦截器

    监听器:listener是servlet规范中定义的一种特殊类.用于监听servletContext.HttpSession和servletRequest等域对象的创建和销毁事件.监听域对象的属性发生 ...

  5. springboot环境下配置过滤器和拦截器

    以前我们在配置过滤器和拦截器的时候,都是一个类继承一个接口,然后在xml中配置一下就ok 但是,但是,这是springboot的环境,没有xml的配置.所以我们还要继续学习啊啊啊啊啊~~~~~ 先简单 ...

  6. SpringBoot入坑指南之六:使用过滤器或拦截器

    在Web应用中,常常存在拦截全部或部分请求进行统一处理的应用场景,如权限校验.参数校验.性能监控等. 在SpringMVC框架中,我们可以通过过滤器或拦截器实现相关功能,spring-boot-sta ...

  7. SpringBoot第五集:整合监听器/过滤器和拦截器(2020最新最易懂)

    SpringBoot第五集:整合监听器/过滤器和拦截器(2020最新最易懂) 在实际开发过程中,经常会碰见一些比如系统启动初始化信息.统计在线人数.在线用户数.过滤敏/高词汇.访问权限控制(URL级别 ...

  8. 过滤器,拦截器,aop区别与使用场景

    1. 什么是过滤器 过滤器,顾名思义就是起到过滤筛选作用的一种事物,只不过相较于现实生活中的过滤器,这里的过滤器过滤的对象是客户端访问的web资源,也可以理解为一种预处理手段,对资源进行拦截后,将其中 ...

  9. Struts2之过滤器和拦截器的区别

    刚学习Struts2这个框架不久,心中依然有一个疑惑未解那就是过滤器和拦截器的区别,相信也有不少人跟我一样对于这个问题没有太多的深入了解 那么下面我们就一起来探讨探讨 过滤器,是在java web中, ...

随机推荐

  1. shell中系统任务设置

    shell中系统任务设置 1.系统启动流程 启动计算机的硬件(BIOS) 读取时间 选择对应的启动模式(USB HDD EFI) 如果是Linux系统,回去找/boot目录.引导这个系统启动 计算机系 ...

  2. 并发编程二、CPU多级缓存架构与MESI协议的诞生

    ​前言: 文章内容:线程与进程.线程生命周期.线程中断.线程常见问题总结 本文章内容来源于笔者学习笔记,内容可能与相关书籍内容重合 偏向于知识核心总结,非零基础学习文章,可用于知识的体系建立,核心内容 ...

  3. Android Kotlin Annotation Processer

    Annotation Processer 注解处理器(Annotation Processer)是javac内置的注解处理工具,可以在编译时处理注解,让我们自己做相应的处理.比如生成重复度很高的代码, ...

  4. PHP生成唯一不重复的编号

    当我们要将一个庞大的数据进行编号时,而编号有位数限制,比如5位的车牌号.10位的某证件号码.订单流水号.短网址等等,我们可以使用36进制计算出符合位数的不重复的编号. 下载:https://url72 ...

  5. GIN and RUM 索引性能比较

    gin索引字段entry构造的TREE,在末端posting tree|list 里面存储的是entry对应的行号. 别无其他信息.rum索引,与GIN类似,但是在posting list|tree的 ...

  6. Linux下自动删除过期备份和自动异地备份

    每天自动删除过期备份 首先编写一个简单的Shell脚本DeleteExpireBackup.sh: #!/bin/bash # 修改需要删除的路径 location="/database/b ...

  7. Linux安装Minio

    Linux安装Minio 一.安装包方式安装 1.下载minio 1.1 手动下载:https://docs.min.io/docs/minio-quickstart-guide.html ​ 访问上 ...

  8. 在Windows Server 2019上安装edge浏览器

    在Windows 2016和2019的正式版本中是不带Edge浏览器的.有些工具.网站也不支持IE浏览器了.对于偶尔需要在服务器上访问这些站点的管理员来说有些不方便.不过可以通过安装三方浏览器或者Ed ...

  9. 5种kafka消费端性能优化方法

    摘要:带你了解基于FusionInsight HD&MRS的5种kafka消费端性能优化方法. 本文分享自华为云社区<FusionInsight HD&MRSkafka消费端性能 ...

  10. 【微服务】- 配置中心 - Nacos

    微服务 - 配置中心 - Nacos 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 今天的学习任务就是学习使用Nacos作为配置中心. 努力克制自己,拒绝摆烂! 什么是配 ...