SpringBoot系列(十一)拦截器与拦截器链的配置与使用详解,你知道多少?
往期推荐
SpringBoot系列(一)idea新建Springboot项目
Springboot系列(七) 集成接口文档swagger,使用,测试
SpringBoot系列(八)分分钟学会Springboot多种解决跨域方式
SpringBoot系列(十)优雅的处理统一异常处理与统一结果返回
目录
1. 拦截器介绍
拦截器是在servlet执行之前执行的程序(这里就是controller代码执行之前),它主要是用于拦截用户请求并作相应的处理,比如说可以判断用户是否登录,做相关的日志记录,也可以做权限管理。
SpringBoot中的拦截器实现和spring mvc 中是一样的,它的大致流程是,先自己定义一个拦截器类,并将这个类实现一个HandlerInterceptor类,或者是继承HandlerInterceptorAdapter,都可以实现拦截器的定义。然后将自己定义的拦截器注入到适配器中,也有两种方式,一种是实现WebMvcConfigurer接口,一种是继承WebMvcConfigurerAdapter。下面我们来看看如何完成。
2.自定义拦截器
直接上代码,再进行一些代码讲解。
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("进入拦截器了");
//中间写逻辑代码,比如判断是否登录成功,失败则返回false
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
//
System.out.println("controller 执行完了");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("我获取到了一个返回的结果:"+response);
System.out.println("请求结束了");
}
}
代码说明:
- 自定义的拦截器可以实现HandlerInterceptor接口,也可以继承HandlerInterceptorAdapter类。
- 重写三个方法,当然也可以只实现一个最重要的preHandle方法。
- preHandle方法:此方法会在进入controller之前执行,返回Boolean值决定是否执行后续操作。
- postHandle方法:此方法将在controller执行之后执行,但是视图还没有解析,可向ModelAndView中添加数据(前后端不分离的)。
- afterCompletion方法:该方法会在整个请求结束(请求结束,但是并未返回结果给客户端)之后执行, 可获取响应数据及异常信息。
3.拦截器注入适配器
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**")//拦截所有的路径
.excludePathPatterns("/LoginController/login");
}
}
代码说明:
- 通过实现WebMvcConfigurer接口可以自定义一个适配器,也可以通过继承WebMvcConfigurerAdapter来定义适配器,建议使用第一种,第二种已经是过时的方法了。
- 重写addInterceptors方法,addInterceptor方法是将拦截器注入到适配器中。
- addPathPatterns方法是设置一个需要拦截的路径,可以是多个字符串或者是直接传入一个数组。
- excludePathPatterns是配置不需要拦截的路径。
- 需要加上configuration注解说明这是一个配置类,在项目启动的时候自动执行。
4.controller测试
先创建一个登陆的测试,这个接口是不会拦截的。
@RestController
@RequestMapping("LoginController")
public class Login {
@RequestMapping("/login")
public String login(){
System.out.println("controller开始执行");
return "login success";
}
}
创建一个拦截的controller
@RestController
@RequestMapping("/hello")
public class HelloController {
@RequestMapping("/hello")
public String hello(){
System.out.println("经过拦截的controller代码执行完毕");
return "hello";
}
}
5. 测试
测试未拦截的接口,浏览器输入:localhost:8097/LoginController/login,查看控制台输出情况。
控制台只输出了未拦截接口内的代码,说明这个接口是未拦截的。浏览器的显示就不管了。其实一般是拦截登录接口,这里就将它放开了,以供测试。
测试拦截的接口,浏览器输入:localhost:8097/hello/hello,查看控制台输出情况。
可以看到,首先是进入了拦截器,通过拦截器之后,进入了controller中的方法,执行完controller的代码之后就进入了自定义拦截器中的postHandle方法,最后进入afterCompletion方法,并获取到了一个response对象。
6. 扩展内容:拦截器链
我们可以定义多个拦截器组成一个拦截器链。我们可以在适配器中注入多个拦截器。多加一行代码就行了。
按照拦截器注入的顺序,拦截器的执行顺序应该是一下顺序:拦截器1,拦截器2,拦截器2处理,拦截器1处理,拦截器2结束,拦截器1结束。对应三个过程的方法就是preHandle,postHandle,afterCompletion。
7. 总结
本文从拦截器的自定义到自定义适配器,然后将拦截器注入适配器,再到编写测试代码。准备工作完成之后就进行一个测试拦截器是否成功,最后扩展出拦截器链的一些内容。如果你觉得本文对你有用,三连走起!
SpringBoot系列(十一)拦截器与拦截器链的配置与使用详解,你知道多少?的更多相关文章
- Git学习系列之Windows上安装Git之后的一些配置(图文详解)
不多说,直接上干货! 前面博客 Git学习系列之Windows上安装Git详细步骤(图文详解) 第一次使用Git时,需要对Git进行一些配置,以方便使用Git. 不过,这种配置工作只需要进行一次便可, ...
- 单元测试系列之四:Sonar平台中项目主要指标以及代码坏味道详解
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6766994.html 众所周知Sona ...
- linux驱动由浅入深系列:高通sensor架构实例分析之三(adsp上报数据详解、校准流程详解)【转】
本文转载自:https://blog.csdn.net/radianceblau/article/details/76180915 本系列导航: linux驱动由浅入深系列:高通sensor架构实例分 ...
- 【HANA系列】【第二篇】SAP HANA XS使用JavaScript编程详解
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列][第二篇]SAP HANA XS ...
- 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解
数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...
- C#二次开发BIMFACE系列61 File Management文件管理服务接口二次开发及实战详解
系列目录 [已更新最新开发文章,点击查看详细] 在我的博客<C#二次开发BIMFACE系列61 File Management文件管理服务接口二次开发及实战详解>最后列出了 Fil ...
- Flume自定义拦截器(Interceptors)或自带拦截器时的一些经验技巧总结(图文详解)
不多说,直接上干货! 一.自定义拦截器类型必须是:类全名$内部类名,其实就是内部类名称 如:zhouls.bigdata.MySearchAndReplaceInterceptor$Builder 二 ...
- elasticsearch最全详细使用教程:入门、索引管理、映射详解、索引别名、分词器、文档管理、路由、搜索详解
一.快速入门1. 查看集群的健康状况http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 状 ...
- 基于Web的Kafka管理器工具之Kafka-manager安装之后第一次进入web UI的初步配置(图文详解)
前期博客 基于Web的Kafka管理器工具之Kafka-manager的编译部署详细安装 (支持kafka0.8.0.9和0.10以后版本)(图文详解) 基于Web的Kafka管理器工具之Kafka- ...
随机推荐
- pycharm 2.7 快捷键
提示 CTRL Q: 在参数列表位置,显示可以输入的所有参数 CTRL Q: 查看选中方法的文档字符串 阅读 CTRL -: 折叠当前代码 CTRL +: 展开当前代码 CTRL SHIFT -: 折 ...
- 用c#求一元二次方程
题目:编一个程序,输入a .b.c 的值,求出一元二次方程a*x*x+b*x+c=0的二个实数根. 我的思路: 我们都知道数学中求一元二次方程有很多方法:直接开方法.配方法.公式法.分解因式法等等,在 ...
- Java线程及其实现方式
一.线程&多线程 线程: 线程是进程的一个实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程 自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序 ...
- 一款基于SVM算法的分布式法律助手
一. 项目简介 与 使用说明 体验网站(适配手机端): http://www.zhuchangwu.com 项目基于 Spring Cloud .Vue 构建,平台针对需要维权的用户而设计,主要提供如 ...
- 新基建新机遇!100页PPT
"新基建"是与传统的"铁公基"相对应,结合新一轮科技革命和产业变革特征,面向国家战略需求,为经济社会的创新.协调.绿色.开放.共享发展提供底层支撑的具有乘数效应 ...
- MFC之TreeCtrl遍历所有节点
这个例子,主要是查找树上的某个节点,并展开选中它.采用来了递归方法来实现.主要用到的方法: CTreeCtrl::GetChildItemHTREEITEM GetChildItem( HTREEIT ...
- LeetCode | 289. 生命游戏(原地算法/位运算)
记录dalao的位运算骚操作 根据百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细 ...
- PTA | 1009说反话(20分)
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式: 测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串.字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有 ...
- 【Mongodb】聚合查询 && 固定集合
概述 数据存储是为了可查询,统计.若数据只需存储,不需要查询,这种数据也没有多大价值 本篇介绍Mongodb 聚合查询(Aggregation) 固定集合(Capped Collections) 准备 ...
- C语言学生管理系统完善版
#include<stdio.h>#include<string.h>#include <stdlib.h>#define M 100struct score ...