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,一经查实,立即删除!

相关文章

全国计算机英语四六级准考证打印准考证号,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 …

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

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

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

在经历了几年的熊市股市之后&#xff0c;2019年股市似乎有所回升. 最近&#xff0c;许多用户询问多屏股票交易计算机的配置&#xff0c;例如三屏&#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…

FreeMarker详细介绍

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

SpringBoot整合Freemarker导出word文档表格

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

ambari 修改服务器名,Ambari修改主页面方法

分享下Ambari修改主页面方法&#xff0c;希望对大家有用。[roothdp159 ambari-web]# brunch watch --serverOct 10:22:43 - info: application started on http://localhost:3333/Oct 10:22:47 - info: compiled 891 files into 5 files, copied 260 in 3988msOct 10:23:12 - i…

快速向服务器传文件格式,客户端如何向服务器传文件格式

客户端如何向服务器传文件格式 内容精选换一换语音通话平台通过此接口向客户推送语音通话业务用户呼叫时的状态信息&#xff0c;如呼入、呼出、振铃、应答、挂机等状态的信息。语音通话平台(客户端) → 客户服务器(服务端)前提条件SP在开发应用时&#xff0c;若需订阅呼叫状态通…

MyBatis-Plus--解决逻辑删除与唯一索引的问题--方法/实例

文章目录简介问题复现依赖**建库建表**代码测试解决方案方案1&#xff1a;将字段设置为id&#xff08;推荐&#xff09;建库建表修改Entity测试方案2&#xff1a;将字段设置为当前时间&#xff08;不推荐&#xff09;建库建表修改Entity测试简介 说明 本文用示例介绍MyBatis-…

MybatisPlus 实体类与数据库表映射关系MybatisPlus:ORM思想

实体类与数据库表映射关系 使用mybatisPlus时&#xff0c;会确定实体类和数据的映射关系 具体的映射方法有两种 1、默认&#xff1a;采用驼峰映射规则 例如MyUserTable 对应的数据库表为 my_user_table ; TEMyUserTable 对应表名为t_e_my_user_table; 2、注解TableName 在…

Spring Boot——maven项目常用打包配置

文章目录一、简介二、pom.xml三、效果图3.1 所有的资源打包到指定的目录maven3.2 所有的配置文件都放到config目录3.3 所有的配置文件都不在jar里&#xff0c;防止敏感信息泄露结语一、简介 maven项目打包是我们程序员经常遇到的事&#xff0c;今天就来弄一个常用的打包方式&a…

史上最全ThreadLocal 详解

文章目录一、ThreadLocal简介二、ThreadLocal与Synchronized的区别三、ThreadLocal的简单使用四、ThreadLocal的原理4.1 ThreadLocal的set()方法&#xff1a;4.2 ThreadLocal的get方法4.3 ThreadLocal的remove方法4.4、ThreadLocal与Thread&#xff0c;ThreadLocalMap之间的关系…

Java递归构建树形结构

记录&#xff1a;在Java后台利用递归思路进行构建树形结构数据&#xff0c;返回给前端&#xff0c;能以下拉菜单等形式进行展示。 简明&#xff1a;为了简化代码&#xff0c;引入Lombok的Jar包&#xff0c;可省略实体类set()、get()方法。 <dependency><groupId>or…

HTTP状态码含义:428、429、431、511431状态码详解

1、428 Precondition Required (要求先决条件) ​ 先决条件是客户端发送 HTTP 请求时&#xff0c;必须要满足的一些预设条件。一个好的例子就是 If-None-Match 头&#xff0c;经常用在 GET 请求中。如果指定了 If-None-Match &#xff0c;那么客户端只在响应中的 ETag 改变后才…

Java 异常——Exception详解

异常的介绍 异常的概念 异常 &#xff1a;指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;最终会导致JVM的非正常停止。 在Java等面向对象的编程语言中&#xff0c;异常本身是一个类&#xff0c;产生异常就是创建异常对象并抛出了一个异常对象。Java处理…

Java中的URL类根据url获取网络文件快速入门Java中的URL(网络编程)

Java中的URL类 远程连接来实现应用。而且&#xff0c;这个平台现在已经可 以对国际互联网以及URL资源进行访问了。Java的URL类可以让访问网络资源就像是访问你本地的文件夹一样方便快捷。我们通过使用Java的URL类 就可以经由URL完成读取和修改数据的操作。 通过一个URL连接&a…