SpringBoot:整合监听器/过滤器和拦截器

整合监听器/过滤器和拦截器

在实际开发过程中,经常会碰见一些比如系统启动初始化信息、统计在线人数、在线用户数、过滤敏/高词汇、访问权限控制(URL级别)等业务需求。实现以上的功能,都会或多或少的用到过滤器监听器拦截器

一.SpringBoot整合过滤器Filter

过滤器Filter,是Servlet的的一个实用技术了。可以通过过滤器,对请求进行拦截处理。

1.编写Filter过滤器

  1. 编写普通Java类实现接口Filter。

  2. 使用注解@WebFilter标注过滤器类,并配置过滤url。

@WebFilter("/*")// 当前配置拦截所有请求
public class TestFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println("过滤器Filter测试执行…………");chain.doFilter(request, response);// 放行}}

说明:@WebFilterServlet3.0新增的注解,原先实现过滤器,需要在web.xml中进行配置,而现在通过此注解,启动启动时会自动扫描自动注册。

  1. 在启动类加入@ServletComponentScan注解
    使用@ServletComponentScan注解后,Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册。

  2. 开启启动类,访问测试,查看控制台结果

当注册多个过滤器时,无法指定执行顺序,早期使用web.xml配置过滤器时,是可指定执行顺序,但使用注解@WebFilter时,没有顺序这个配置属性。通常情况下,如果对过滤器有特定顺序要求的,我们推荐采用原始方式配置,或者参考测试结果:执行顺序和类名字符排序有关。另外SpringBoot也为解决这个问题,单独提供了一个类FilterRegistrationBean,此类提供setOrder方法,可以为filter设置排序值,让Spring在注册Filter之前排序后再依次注册。

2.解决多过滤器执行顺序问题

  1. 编写两个/以上Filter,修改Filter的实现(去除注解@WebFilter即可,其他代码无需改动)

  2. 编写一个config配置类,利用FilterRegistrationBean实现注册过滤器。

    FilterRegistrationBean是SpringBoot提供的用于注册和

    解决Filter执行顺序问题

    的类。注意在类上使用注解@Configuration,在方法上使用注解@Bean。

@Configuration    // 标注为Spring配置beans组件
public class FilterConfig {// 注册第一个Filter@Bean // 标注为Spring配置bean组件public FilterRegistrationBean<Filter> registerFilter1() {//通过FilterRegistrationBean实例设置优先级可以生效FilterRegistrationBean<Filter> registrationBean = new  FilterRegistrationBean<>();// 注册自定义过滤器registrationBean.setFilter(new TestFilter1());// 设置过滤器的名字<filter-name>registrationBean.setName("filter01");// 设置过滤器的名字过滤路径<url-partten>registrationBean.addUrlPatterns("/*");// 设置过滤器优先级:最顶级registrationBean.setOrder(1);return registrationBean;}@Beanpublic FilterRegistrationBean<Filter> registerFilter2() {FilterRegistrationBean<Filter> registrationBean = new  FilterRegistrationBean<>();// 注册第二个自定义过滤器TestFilter2registrationBean.setFilter(new TestFilter2());registrationBean.setName("filter02");registrationBean.addUrlPatterns("/*");registrationBean.setOrder(5);return registrationBean;}}
  1. 开启启动类,访问测试,查看控制台结果
    说明:这种方式可以不使用注解@ServletComponentScan

二.SpringBoot整合监听器Listnner

Listnner是servlet规范中定义的一种特殊类。用于监听ServletContext、HttpSession和servletRequest等域对象的创建和销毁事件。监听域对象的属性发生修改的事件。用于在事件发生前、发生后做一些必要的处理。一般是获取在线人数等业务需求。

  1. 创建普通类实现监听器接口(比较多,我就不一一列出了)

    本次案例:创建了

    ServletRequest

    监听器,实现接口

    ServletRequestListnner

@WebListener
@Slf4j  // 该注解等价于Logger  log = new Logger(。。。。)
public class TestListnner implements ServletRequestListener {@Overridepublic void requestInitialized(ServletRequestEvent sre) {log.info("ServletRequest出生…………");}@Overridepublic void requestDestroyed(ServletRequestEvent sre) {log.info("ServletRequest销毁…………");}
}
  1. 在启动类加入@ServletComponentScan注解
    使用@ServletComponentScan注解后,Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册。

  2. 开启启动类,访问测试,查看控制台结果

三.SpringBoot整合拦截器HandlerInterceptor

以上的过滤器、监听器都属于Servlet的API,我们在开发中过滤web请求时,还可以使用Spring提供的拦截器(HandlerInterceptor)进行更加精细的控制。

  1. 编写普通类实现接口HandlerInterceptor。
@Slf4j
public class TestHandlerInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {log.info("preHandle请求访问前,拦截执行……");// 返回 false 则请求中断return  true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {log.info("postHandle请求访问后,执行……");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {log.info("afterCompletion请求调用完成后回调方法,即在视图渲染完成后回调……");}}
  1. 编写普通类继承

WebMvcConfigurerAdapter配置类是spring提供的一种配置方式,采用JavaBean的方式替代传统的基于xml的配置来对spring框架进行自定义的配置,可以自定义一些Handler,Interceptor,ViewResolver,MessageConverter。因此,在spring boot提倡的基于注解的配置,采用“约定大于配置”的风格下,当需要进行自定义的配置时,便可以继承WebMvcConfigurerAdapter这个抽象类,通过JavaBean来实现需要的配置。
  WebMvcConfigurerAdapter是一个抽象类,它只提供了一些空的接口让用户去重写,比如如果想添加拦截器的时候,需要去重写一下addInterceptors()这个方法,去配置自定义的拦截器。我们可以看一下WebMvcConfigurerAdapter提供了哪些接口来供我们使用。

public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {/*配置路径匹配参数*/public void configurePathMatch(PathMatchConfigurer configurer) {}/*配置Web Service或REST API设计中内容协商,即根据客户端的支持内容格式情况来封装响应消息体,如xml,json*/public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {}/*配置路径匹配参数*/public void configureAsyncSupport(AsyncSupportConfigurer configurer) {}/* 使得springmvc在接口层支持异步*/public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {}/* 注册参数转换和格式化器*/public void addFormatters(FormatterRegistry registry) {}/* 注册配置的拦截器*/public void addInterceptors(InterceptorRegistry registry) {}/* 自定义静态资源映射*/public void addResourceHandlers(ResourceHandlerRegistry registry) {}/* cors跨域访问*/public void addCorsMappings(CorsRegistry registry) {}/* 配置页面直接访问,不走接口*/public void addViewControllers(ViewControllerRegistry registry) {}/* 注册自定义的视图解析器*/public void configureViewResolvers(ViewResolverRegistry registry) {}/* 注册自定义控制器(controller)方法参数类型*/public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {}/* 注册自定义控制器(controller)方法返回类型*/public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {}/* 重载会覆盖掉spring mvc默认注册的多个HttpMessageConverter*/public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {}/* 仅添加一个自定义的HttpMessageConverter,不覆盖默认注册的HttpMessageConverter*/public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {}/* 注册异常处理*/public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {}/* 多个异常处理,可以重写次方法指定处理顺序等*/public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {}
}

Spring 5.0/SpringBoot 2.0 后,WebMvcConfigurerAdapter被废弃,取代的方法有两种:

①implements WebMvcConfigurer(官方推荐)

②extends WebMvcConfigurationSupport

@Configuration  // 标注为Spring组件
public class HandlerInterceptorConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 添加一个实现HandlerInterceptor接口的拦截器实例registry.addInterceptor(new TestHandlerInterceptor())// 用于设置拦截器的过滤路径规则.addPathPatterns("/**")// 用于设置不需要拦截的过滤规则.excludePathPatterns("/emp/toLogin","/emp/login", "/js/**", "/css/**", "/images/**");}
}

注意在类上添加注解@Configuration标注为Spring组件

  1. 开启启动类,访问测试,查看控制台结果

一张图理解过滤器,拦截器执行

img

目前互联网上很多大佬都有SpringBoot系列教程,如有雷同,请多多包涵了。画图太费事了,图片来源于网络。

原文地址:https://www.cnblogs.com/xsge/p/13915775.html

https://www.cnblogs.com/xsge/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554842.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国为什么不发展民用计算机,为什么大多数人都错估了计算机与AI的发展?

据SingularytyHub报道&#xff0c;到目前为止&#xff0c;我们大多数人都已经熟悉摩尔定律(Moore s Law)&#xff0c;这条著名的定律认为&#xff0c;计算能力的发展遵循指数曲线&#xff0c;每18个月左右性价比就会翻一番。然而&#xff0c;当涉及到将摩尔定律被应用到不同的商…

mybatis-plus使用和原理剖析之逻辑删除

系列文章 mybatis-plus使用和原理剖析之条件构造器 文章目录一、官方说明二、使用方法三、原理剖析1.SQL注入器原理2.SelectById3.DeleteById4.总结四、风险评估一、官方说明 逻辑删除 说明: 只对自动注入的 sql 起效: 插入: 不作限制查找: 追加 where 条件过滤掉已删除数据,…

全国计算机英语四六级准考证打印准考证号,2017全国大学生英语四六级准考证打印...

2017年上半年度CET考试时间为6月17日&#xff0c;同学们打印准考证了吗?为方便大家打印四六级准考证&#xff0c;yjbys小编为大家分享英语四级考试准考证打印官方主页入口如下&#xff1a;2017年上半年度CET考试时间及报名方式一、考试科目及时间1.笔试考试时间日期(6月17日)考…

Centos7配置Jenkins

Centos7配置Jenkins jenkins 官方下载地址&#xff1a;https://mirrors.jenkins-ci.org/redhat/ maven 官方下载地址&#xff1a;https://archive.apache.org/dist/maven/maven-3/ tomcat 官方下载地址&#xff1a;https://tomcat.apache.org/download-90.cgi 1、配置jdk …

学计算机的写论文题目,经典本科计算机论文选题 本科计算机论文题目怎样取...

【100道】经典本科计算机论文选题,每一个论文题目都是精选出来的,看了后定能知晓本科计算机论文题目怎样取等相关写作技巧,让本科计算机论文写作轻松起来&#xff01;一、比较好写的本科计算机论文题目:1、应用型本科计算机的数学实验教学研究2、对应用型本科计算机网络方向实践…

Collectors.groupingBy()进行分组时,分组值存在null值会报NPE(空指针)错误,使用时要注意

问题分析&#xff1a; 1、使用Collectors.groupingBy()进行分组时&#xff0c;分组值存在null值。 List<String> strList new ArrayList<>(Arrays.asList("11", "12", "13", null, null)); Map<String, List<String>>…

计算机硬盘用u盘维修,U盘装机大师修复磁盘坏道详细教程

我们都知道当我们的磁盘使用的时间久了就会容易出现各种问题&#xff0c;然而硬盘的坏道是最常见的问题之一。关于磁盘出现坏道有很多原因&#xff0c;诸如硬盘本身质量问题&#xff0c;老化&#xff0c;使用不当等等。我们的硬盘内存太小也会导致应用软件对硬盘频繁访问&#…

Linux中Minio安装与启动

Minio是在Apache License v2.0下发布的对象存储服务器。它与Amazon S3云存储服务兼容。它最适合存储非结构化数据&#xff0c;如照片&#xff0c;视频&#xff0c;日志文件&#xff0c;备份和容器/ VM映像。对象的大小可以从几KB到最大5TB。Minio服务器足够轻&#xff0c;可以与…

多屏幕炒股计算机配置,多屏幕股票交易计算机配置建议使用i59400F计算机主机配置(最多六个屏幕)...

在经历了几年的熊市股市之后&#xff0c;2019年股市似乎有所回升. 最近&#xff0c;许多用户询问多屏股票交易计算机的配置&#xff0c;例如三屏&#xff0c;四屏&#xff0c;和六屏. 实际上&#xff0c;与普通计算机的最大区别是该图形卡需要配备多屏幕图形卡. 一台计算机可以…

List.removeIf():删除集合中满足给定条件的所有元素

今天偶然间发现了Collection在1.8新增了一个removeIf(Predicate<? super E> filter)方法&#xff0c;能够实现面试官们常问的&#xff1a;如何一边遍历&#xff0c;一边删除。 首先是源码 /*** Removes all of the elements of this collection that satisfy the given…

计算机专业论文docx,计算机系毕业论文范文-20210606000812.docx-原创力文档

计算机系毕业论文范文一&#xff1a;计算机技术在工程项目管理中的应用推动国家经济发展的核心是科学技术的进步。有效推动科学技术进步的关键在于创新&#xff0c;这是国家经济与社会前进的有效动力&#xff0c;在相关产业领域也发挥着非常重要作用&#xff0c;作为国家经济的…

小学二年级上学期计算机教案,小学数学二年级上册分苹果教案设计

小学数学二年级上册分苹果教案设计〖教学目标1.经历分苹果等实际操作&#xff0c;初步体会有余数除法与生活的密切联系&#xff0c;进一步体会除法的意义。2.通过实际操作&#xff0c;抽象出有余数除法的书写格式&#xff0c;并体会余数一定要比除数小。〖教材分析分苹果是二年…

生物计算机的主要原材料是(),新材料为生物计算机打造“神经元”和“突触”...

一项最新研究利用复杂的氧化物&#xff0c;打造出了与神经元和突触相似的元件。图片来自pixabay.com虽然电脑的计算速度比人脑快&#xff0c;但在物体识别任务等方面&#xff0c;人脑还是更胜一筹。除此之外&#xff0c;人脑耗费的能量也远低于电脑。大脑的运作方式可以在一定程…

hotmail接收邮件服务器(pop),Microsoft微软邮箱 outlook、hotmail 打开pop和imap的方法

分享个微软邮箱 outlook、hotmail 打开pop和imap的方法只有打开了pop或者imap &#xff0c; foxmail一类的邮件管理客户端才能正常收邮件&#xff1b;打开了smtp才能正常发邮件。设置方法如图&#xff1a;1.登录进去账户以后&#xff0c;点击右上角的设置&#xff0c;齿轮图标&…

MySQL 索引 是如何提高 查询效率 的?

前言 我们都知道当查询数据库变慢时&#xff0c;需要建索引去优化。但是只知道索引能优化显然是不够的&#xff0c;我们更应该知道索引的原理&#xff0c;因为不是加了索引就一定会提升性能。那么接下来就一起探索MYSQL索引的原理吧 什么是索引 索引其实是一种能高效帮助MYS…

yii2 ajax访问控制器,如何在yii2中运行控制器动作作为ajax

使用模态来解决它。use yii\bootstrap\Modal;use johnitvn\ajaxcrud\CrudAsset;Html::a(Custom, [custom], [role>modal-remote, title>Custom]);在页面底部.."id">"ajaxCrudModal","footer">"",// always need it for jq…

ajax onerror code,Ajax请求'onError'处理程序

我的网站上有一项功能&#xff1a;删除不刷新页面。用户只需按下删除&#xff0c;浏览器就会发送Ajax请求。它会用ID参数加载delete脚本。Ajax请求onError处理程序一切正常。但由于数据库的参照完整性&#xff0c;它不是很好。例如&#xff0c;有可能删除一些人居住的街道。我想…

FreeMarker详细介绍

FreeMarker 1. 主要内容 2.FreeMarker概述 2.1. FreeMarker概念 FreeMarker 是一款 模板引擎&#xff1a; 即一种基于模板和要改变的数据&#xff0c; 并用来生成输出文本(HTML网页&#xff0c;电子邮件&#xff0c;配置文件&#xff0c;源代码等)的通用工具。 是一个Java类…

微信游戏奇迹暖暖选取服务器失败,奇迹暖暖微信登录授权失败

《远征》即将推出衣橱系统 或将成为网游版奇迹暖暖双十一狂欢刚刚落幕&#xff0c;这几天的状态都将在等快递、拆快递中度过&#xff0c;而你剁手而来的衣服&#xff0c;是否需要一个大大的衣帽间呢?《奇迹重生》持之以恒玩家的专属嘉奖坚持不懈的努力才能最终成为真正的强者!…

SpringBoot整合Freemarker导出word文档表格

freemarker模板里面的template.process()方法里传入的第一个参数Object类型&#xff0c;如果是一个实体类对象在模板上怎么进行渲染&#xff0c;将实体类的值取出 freemarker会调用ObjectWrapper对传入的对象进行warp&#xff0c;具体类型在代码里面用instanceof进行判断。一般…