玩转 SpringBoot 2 快速整合拦截器
概述
首先声明一下,这里所说的拦截器是 SpringMVC 的拦截器(HandlerInterceptor)。使用SpringMVC 拦截器需要做如下操作:
- 创建拦截器类需要实现 HandlerInterceptor
- 在 xml 配置文件中配置该拦截器,具体配置代码如下:
<mvc:interceptors><mvc:interceptor><!-- /test/** 这个是拦截路径以/test开头的所有的URL--><mvc:mapping path="/**"/><!—这个是拦截所有的路径--><!-- 配置拦截器类路径--><bean class="cn.ljk.springmvc.controller.MyInterceptor"></bean><!-- 配置不拦截器URL路径--><mvc:exclude-mapping path="/fore/**"/></mvc:interceptor>
</mvc:interceptors>
因为在SpringBoot 中没有 xml 文件,所以SpringBoot 为我们提供 Java Config 的方式来配置拦截器。配置方式有2种:
- 继承 WebMvcConfigurerAdapter (官方已经不建议使用)
- 实现 WebMvcConfigurer
接下来开始 SpringBoot 整合拦截器操作详细介绍!
整合拦截器实战操作
第一步:声明拦截器类
通过实现 HandlerInterceptor 来完成。具体代码如下:
public class LoginInterceptor implements HandlerInterceptor{}
第二步:实现 HandlerInterceptor 3 个拦截方法
- preHandle:Controller逻辑执行之前进行拦截
- postHandle:Controller逻辑执行完毕但是视图解析器还未进行解析之前进行拦截
- afterCompletion:Controller逻辑和视图解析器执行完毕进行拦截
实际开发中 preHandle 使用频率比较高,postHandle 和 afterCompletion操作相对比较少。在下面的代码中 preHandle 方法中定义拦截所有访问项目 url 并进行日志信息记录。
postHandle 中在视图解析前进行拦截,通过 Model 再次添加数据到 Request域中。
afterCompletion 暂时没有想到使用场景,如果有使用过的场景可以在下面评论区中进行评论。
拦截器详细代码如下:
public class LoginInterceptor implements HandlerInterceptor{private Logger log = LoggerFactory.getLogger(LoginInterceptor.class);//ControllerController逻辑执行之前public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.info("preHandle....");String uri = request.getRequestURI();log.info("uri:"+ uri);if (handler instanceof HandlerMethod) {HandlerMethod handlerMethod = (HandlerMethod) handler;log.info("拦截 Controller:"+ handlerMethod.getBean().getClass().getName());log.info("拦截方法:"+handlerMethod.getMethod().getName());}return true;}//Controller逻辑执行完毕但是视图解析器还未进行解析之前@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {log.info("postHandle....");Map<String,Object>map=modelAndView.getModel();map.put("msg","postHandle add msg");}//Controller逻辑和视图解析器执行完毕@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {log.info("afterCompletion....");}
}
第三步:Java Config 的方式来配置拦截器
继承 WebMvcConfigurerAdapter 方式
通过继承 WebMvcConfigurerAdapter 并重写 addInterceptors方法,通过其参数 InterceptorRegistry 将拦截器注入到 Spring的上下文中。
另外拦截路径和不拦截的路径通过InterceptorRegistry 的 addPathPatterns 和 excludePathPatterns 方法进行设置。
继承 WebMvcConfigurerAdapter 方式官方已经不建议使用,因为官方已将 WebMvcConfigurerAdapter 标记为@Deprecated 了。
@Deprecated
public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {
继承 WebMvcConfigurerAdapter 方式具体代码如下:
@Configurationpublic class InterceptorConfigByExtendsWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter{@Beanpublic LoginInterceptor loginInterceptor(){return new LoginInterceptor();}public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor()).addPathPatterns("/**").excludePathPatterns("/*.html");}
}
实现 WebMvcConfigurer 方式
通过实现 WebMvcConfigurer 接口 并实现 addInterceptors方法,其他操作和继承 WebMvcConfigurerAdapter 方式一样。具体代码如下:
@Configuration
public class InterceptorConfigByImplWebMvcConfigurer implements WebMvcConfigurer{@Beanpublic LoginInterceptor loginInterceptor(){return new LoginInterceptor();}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor()).addPathPatterns("/**").excludePathPatterns("/*.html");}
}
测试
编写普通Controller,具体代码如下:
@Controller
public class IndexController {@GetMapping("/index")public String index(ModelAndView modelAndView){return "index";}
}
在 src/main/resource 下的 templates 目录下创建 IndexController 访问页面 index.ftl, 代码如下:
<h1>${msg}</h1>
由于我这里使用的是 Freemarker 当页面使用,所以需要引入 freemarker starter依赖,具体点如下:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency>
通过游览器访问 localhost:8080/sbe/index,具体访问效果如下:
如上图所示在视图解析前通过 Model 再次添加数据到 Request域中的msg 成功显示出来了!
日志输出信息如下:(拦截地址和拦截Controller 和具体方法进行日志输出)
2019-09-24 15:53:04.144 INFO 7732 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/sbe] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-09-24 15:53:04.145 INFO 7732 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2019-09-24 15:53:04.153 INFO 7732 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 8 ms
2019-09-24 15:53:04.155 INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor : preHandle....
2019-09-24 15:53:04.155 INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor : uri:/sbe/index
2019-09-24 15:53:04.155 INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor : 拦截 Controller:cn.lijunkui.controller.IndexController
2019-09-24 15:53:04.155 INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor : 拦截方法:index
2019-09-24 15:53:04.156 INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor : postHandle....
2019-09-24 15:53:04.161 INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor : afterCompletion....
小结
SpringBoot 2 整合拦截器和整合 Filter的操作很像,都是通过一个注册类将其注入到Spring的上下文中,只不过Filter使用的是 FilterRegistrationBean 而 拦截器使用的是 InterceptorRegistry。
个人觉得比使用 xml 配置的方式更为简单了,如果你还没有在 SpringBoot 项目中使用过拦截器,赶快来操作一下吧!
代码示例
具体代码示例请在我的GitHub 仓库 springbootexamples 中模块名为 spring-boot-2.x-interceptor 项目中进行查看
GitHub:https://github.com/zhuoqianmingyue/springbootexamples
玩转 SpringBoot 2 快速整合拦截器相关推荐
- 玩转 SpringBoot 2 快速整合 | RESTful Api 篇
概述 RESTful 是一种架构风格,任何符合 RESTful 风格的架构,我们都可以称之为 RESTful 架构.我们常说的 RESTful Api 是符合 RESTful 原则和约束的 HTTP ...
- 在SpringBoot项目中整合拦截器
拦截器在Web系统中非常常见,对于某些全局统一的操作,我们可以把它提取到拦截器中实现.总结起来,拦截器大致有以下几种使用场景: 1.权限检查:如登录检测,进入处理程序检测用户是否登录,如果没有,则直接 ...
- 玩转 SpringBoot 2 快速整合 Filter 注解版
前言 本文主要介绍如何在SpringBoot 2 中使用 Filter 的快速搭建教程,阅读前需要你必须了解 Filter 的基础使用以及如何搭建 SpringBoot 项目. 快速演示操作 第一步: ...
- 玩转 SpringBoot 2 快速整合 Listener
前言 本文主要介绍如何在SpringBoot 2 中使用 Listener 的快速搭建教程,阅读前需要你必须了解 Listener 的基础使用以及如何搭建 SpringBoot 项目. 快速演示操作 ...
- 玩转 SpringBoot 2 快速整合 Servlet
前言 本文主要介绍如何在SpringBoot 2 中使用 Servlet 的快速搭建教程,阅读前需要你必须了解 Servlet 的基础使用以及如何搭建 SpringBoot 项目. 快速演示操作 第一 ...
- 玩转 SpringBoot 2 快速整合 | JSP 篇
前言 JavaServer Pages(JSP)技术使Web开发人员和设计人员能够快速开发和轻松维护利用现有业务系统的信息丰富的动态Web页面.作为Java技术系列的一部分,JSP技术可以快速开发独立 ...
- 玩转 SpringBoot 2 快速整合 | 丝袜哥(Swagger)
概述 首先让我引用 Swagger 官方的介绍: Design is the foundation of your API development. Swagger makes API design ...
- 玩转 SpringBoot 2 快速整合 Filter
概述 SpringBoot 中没有 web.xml, 我们无法按照原来的方式在 web.xml 中配置 Filter .但是我们可以通过 javaConfig(@Configuration +@Bea ...
- 玩转 SpringBoot 2 快速整合 | Thymeleaf 篇
前言 Thymeleaf是一个适用于Web和独立环境的现代服务器端Java模板引擎. Thymeleaf的主要目标是为您的开发工作流程带来优雅的自然模板 - 可以在浏览器中正确显示的HTML,也可以用 ...
最新文章
- 今日头条女程序员加班加到不来大姨妈,凌晨十二点半回家的她竟然还被老板吐槽不投入!妹子抑郁大哭!...
- 【周末阅读】你不得不知道的10大AI赋能行业,你身边都能找到!
- SimpleDateFormat和DateFormat类不是线程安全的。
- 【学习笔记】比较分别用prim和kruskal实现最小生成树和算法优化方案
- python环境配置与pytorch下载
- kafka自带的zk启动_Centos上将zookeeper和kafka设置为开机自启
- torchtext处理文本数据——将文本变为embedding(学习三)
- 单调栈 BZOJ2364 城市美化
- RedissonMultiLock + RedissonLock部分源码
- 【C++】单例模式代码实现
- froala富文本编辑器与golang、beego,脱离ueditor苦海
- PHP为什么是最好的编程语言?
- 蓝桥ROS机器人之turtlesim贪吃蛇
- 时钟芯片AD9520
- 5v继电器模块实物接线_一秒看懂基础继电器电路图解
- Andriod 实现一个类微信聊天界面 (二)
- Windows 编程基础(四)
- arduino nano + nrf24
- Windows命令查看文件的MD5/SHA1/SHA256
- 计算机网络复习——第四章网络层
热门文章
- c语言求今年第m月的天数,《C语言及程序设计》实践参考——当年第几天(数组方案)...
- linux 编译环境包,linux上war包编译环境搭建
- python-三层神经网络的分类回归问题
- OpenShift 4 - 使用ArgoCD Operator
- 边缘设备上的实时AI人员检测:检测视频中的人员
- 使用Jenkins在Azure Web App上进行ASP.NET Core应用程序的持续集成和部署(CI/CD)–第4天
- 准备好所有应用程序以进行本地化
- php转go注意,PHP转Golang一些感想
- python执行shellcode_python exec shellcode
- python写文件追加 按行追加_你真的会用python进行文件操作吗