对于JavaWeb开发,拦截器和过滤器无疑是两个非常重要的知识点,在传统SpringMVC的框架配置中,是令人很头疼的一个事情,因为需要在web.xml中配置,但是自从有了SpringBoot这一切都变得非常的简单,没有任何复杂点。任何人都能在1分钟内学会如何进行配置整合,下面跟着小编来一起配置拦截器和过滤器。

通读全文大概需要1分钟

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R1FOkUJL-1658487272970)(http://p3.pstatp.com/large/pgc-image/576fb4289f374697ac24fe3f6ef12b67)]

教程目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-67UcbPyx-1658487272971)(http://p1.pstatp.com/large/pgc-image/3b41130156a642469dc284346fc845e0)]

目标是什么?

  1. 过滤器和拦截器的根本区别
  2. 快速配置过滤器
  3. 快速配置拦截器

开发环境

  1. JDK1.8或更高版本
  2. Maven
  3. IntelliJ IDEA 开发工具
  4. 开发框架SpringBoot2.x

项目目录

|____resources
|____java
| |____web
| | |____WebApplication.java
| | |____config
| | | |____RestWebFilterConfig.java
| | | |____InterceptorConfig.java
| | | |____LogInterceptor.java
| | | |____RestWebFilter.java
| | |____controller
| | | |____RestWebController.java

过滤器和拦截器的根本区别

  1. 过滤器是servlet规范规定的,只能用于web程序中,而拦截器是在spring容器中,它不依赖servlet容器。
  2. 拦截器属于Spring中的概念,可以在拦截器中使用任何Spring中的Bean信息,而过滤器不属于Spring中的概念点,所以过滤器不行.
  3. 过滤器可以拦截几乎所有的请求(包含对静态资源的请求),而拦截器只拦截Spring中的请求处理器(不拦截静态资源请求)
  4. 不管是过滤器还是拦截器都是AOP编程思想的体现。
  5. 过滤器的执行顺序在拦截器之前

快速配置过滤器

配置过滤器主要有两种方式

  1. servlet自代的注解@WebFilter
  2. 基于SpringBoot配置FilterRegistrationBean
Servlet自代的注解@WebFilter

先创建过滤器实现类,然后添加在SpringBoot main方法添加ServletComponentScan开启扫描Servlet注解

@WebFilter(urlPatterns = "/*", filterName = "RestWebFilter")
public class RestWebFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {long start = System.currentTimeMillis();filterChain.doFilter(servletRequest, servletResponse);System.out.println("Execute cost=" + (System.currentTimeMillis() - start));}@Overridepublic void destroy() {}
}

添加ServletComponentScan开启扫描Servlet注解

//添加ServletComponentScan开启扫描Servlet注解
@ServletComponentScan
@SpringBootApplication
public class WebApplication {public static void main(String[] args) {SpringApplication.run(WebApplication.class, args);}
}
基于SpringBoot配置FilterRegistrationBean

通过Configuration的方式创建Bean,不清楚如何使用Configuration的同学可以看上一篇

@Configuration
public class RestWebFilterConfig {@Beanpublic FilterRegistrationBean filterRegistrationBean(){FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();filterRegistrationBean.setFilter(new RestWebFilter());filterRegistrationBean.setName("RestWebFilter2");filterRegistrationBean.addUrlPatterns("/*");return filterRegistrationBean;}
}

使用上面任何一种方式都可以实现过滤器的配置。

快速配置拦截器

在SpringBoot2.0及Spring 5.0 WebMvcConfigurerAdapter已被废弃。

拦截器的配置需要注意的是,在Spring5和之前版本有一点小小的区别。如果你之前使用SpringBoot1.x

那么拦截器的配置可能是下面这样。

public class InterceptorConfig extends WebMvcConfigurerAdapter {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LogCostInterceptor()).addPathPatterns("/**");super.addInterceptors(registry);}
}

这种方式在SpringBoot2中已经被废弃了。建议使用最新方式。将继承WebMvcConfigurerAdapter换成实现WebMvcConfigurer

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LogInterceptor()).addPathPatterns("/*");}
}

请求耗时拦截器实现

拦截器和过滤器都可以实现日志拦截的功能,也可以对执行类进行耗时的统计,同时也可以获取请求的信息。下面分享一个具有耗时统计的拦截器。

public class LogInterceptor implements HandlerInterceptor {private final static Logger logger = LoggerFactory.getLogger(LogInterceptor.class);private final static ThreadLocal<Long> processor = new ThreadLocal<>();@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//根据请求信息判断是否需要拦截return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {logger.info("请求信息打印...");processor.set(System.currentTimeMillis());}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {Long startTime = processor.get();Long endTime = System.currentTimeMillis();processor.remove();// 处理完请求,返回内容logger.info("-----------------方法执行完毕,耗时:{}ms-------------------", (endTime - startTime));}
}

获取本课程代码请关注头条号: 软件编程指南 ,私信: 004

更多了解可以点击小编博客: https://blog.springlearn.cn/posts/4135/

SpringBoot2.0学习第四篇之拦截器过滤器配置相关推荐

  1. SpringCloud、SpringBoot2.0 整合Oauth2 (四) 配置文件快速配置url过滤

    SpringBoot2.0 整合Oauth2 (四) 配置文件快速配置url过滤 文章目录 SpringBoot2.0 整合Oauth2 (四) 配置文件快速配置url过滤 1.添加url过滤配置 2 ...

  2. MVC教程第六篇:拦截器

    MVC教程第六篇:拦截器      摘要 本文将对"MVC公告发布系统"的发布公告功能添加日志功能和异常处理功能,借此来讨论ASP.NET MVC中拦截器的使用方法. 一个小难题 ...

  3. Struts2学习笔记(九) 拦截器(Interceptor)(下)

    拦截器的查找顺序 如果我们在多个地方配置了拦截器,那么框架会按什么样的顺序进行查找呢: (1)   首先查找当前Action是否声明了拦截器,如果有则使用这个拦截器,不再继续寻找,如果没有,则执行下一 ...

  4. java过滤器原理,拦截器,过滤器,监听器 区别及执行顺序

    本文引用该作者(花开半夏)著作内容,觉得写的很好,记录一下便于回看防止失踪,更多详情请查看原作者. 同时还搜罗了其他便于理解的博文感兴趣的可以看看促进理解 拦截器,过滤器,监听器执行顺序(被拦截个人过 ...

  5. Spring事务配置方式(一) 拦截器方式配置

    一.使用<tx:advice>和<aop:config>配置事务 <!-- 配置事务管理器 --><bean id="transactionMana ...

  6. Struts2 拦截器的配置:

    Struts2 拦截器的配置: 第一步:在struts.xml文件中加入拦截器配置: 我们可以在配置拦截器的时候,自己定义一个拦截器栈来包含我们自己定义的拦截器(注意:一定要将 defaultStac ...

  7. vue2中使用axios,以及axios拦截器的配置

    目录 一.vue2项目中如何实现异步请求 1.axios:是一个基于Promise的网络请求库.既可以在node.js(服务器端)使用,也可以在浏览器端使用 2.vue中的使用方法 ​ (2)引用方法 ...

  8. vue跨域和拦截器的配置

    最近项目中需要使用vue框架.虽然vue在前端开发人员里也不算是什么新鲜的事儿了.只要是搞前端的都会一些vue的操作.我也不多说,直接进入正题.(这儿我以vue2.x为例) 安装什么的,我就不在这儿说 ...

  9. 给axios的请求拦截器中配置token

    axios 1. 配置token 用户第一次登录系统时,服务器端会返回一个身份秘钥信息(token),表明当前用户有资格.权限访问服务器,客户端获取token之后,通过sessionStorage存储 ...

  10. CC00038.kafka——|Hadoopkafka.V23|——|kafka.v23|消费者拦截器参数配置|

    一.消费者拦截器参数配置:消费者参数配置补充 配置项 说明 bootstrap.servers 建立到Kafka集群的初始连接用到的host/port列表. 客户端会使用这里指定的所有的host/po ...

最新文章

  1. java工具集_Java 工具集
  2. .net安装_无需安装Python,就可以在.NET里调用Python库
  3. php mysql简单留言本_php+mysql写的简单留言本实例代码
  4. table合并单元格宽度自适应
  5. LeetCode 1521. 找到最接近目标值的函数值(位运算)
  6. redis rua解决库存问题_如何解决高并发下的库存安全问题,没你想得那么复杂(附源码)...
  7. 免费linux 脚本,替换xshell,说一下一些免费的shell工具
  8. AQS抽象队列同步器
  9. 2022年MSI赛程安排时间表 MSI赛事规则
  10. 【常识】常见外国计量单位
  11. 【泛微表单】请假流程中计算请假时长(非系统自带考勤类型)
  12. C++:实现量化N阶导数运算测试实例
  13. traceroute 安装及使用
  14. 诚迈科技智能汽车软件产业峰会落幕,智达诚远峰昇操作系统FusionOS发布!
  15. 使用 ipmitool 实现 Linux 系统下对服务器的BMC管理
  16. 一张图把DCDC电源拓扑“融会贯通”
  17. usart串口发送与接收问题
  18. 多功能报警杆在高速服务区的应用
  19. 在学校计算机如何退出老师控制,电脑怎么退出老师控制
  20. Java 枚举(enum) 详解7种常见的用法<详细>

热门文章

  1. 跨网页的新手引导_用户体验之如何设计一个完美的新手引导流程?(附带案例)...
  2. 分享CFA二级优质复习方法!
  3. css音乐播放器插件,jQuery MPlayer音乐播放器插件
  4. 100名网工备考IE,最终能通过的,到底有几个?
  5. 嵌入式系统之CMSIS学习笔记
  6. 做一个微信欢乐斗地主之残局解答器!
  7. arctanx麦克劳林公式推导过程_经典卢瑟福散射公式的初等推导
  8. 【机器学习】图解机器学习神器:Scikit-Learn
  9. TBSchedule源码学习笔记-启动过程
  10. 17SWFObject使用