【快学springboot】12.实现拦截器

栏目: Java · 发布时间: 5年前

内容简介:之前在下面,我们就通过代码,使用WebMvcConfigurer接口来实现一个springboot的拦截器。这里都是基于之前的项目开发的,之前的WebConfig.java如下:

之前在 【快学springboot】6.WebMvcConfigurer配置静态资源和解决跨域 里有用到WebMvcConfigurer接口来实现静态资源的映射和解决跨域请求,并且在文末还说了WebMvcConfigurer(springboot2.x之后使用该接口,springboot1.x使用WebMvcConfigurerAdapter类,不过该类已经被标识过期了)可以配置很多东西,如下:

【快学springboot】12.实现拦截器

下面,我们就通过代码,使用WebMvcConfigurer接口来实现一个springboot的拦截器。

WebMvcConfigurer的addInterceptors方法添加拦截器

这里都是基于之前的项目开发的,之前的WebConfig.java如下:

@Configuration
public class WebConfig implements WebMvcConfigurer {
​
 @Override
 public void addResourceHandlers(ResourceHandlerRegistry registry) {
 registry.addResourceHandler("/file/**")
 .addResourceLocations("file:D:\");
 }
​
 /**
 * 跨域支持
 */
 @Override
 public void addCorsMappings(CorsRegistry registry) {
 registry.addMapping("/**")
 .allowedOrigins("*")
 .allowCredentials(true)
 .allowedMethods("GET", "POST", "DELETE", "PUT", "PATCH")
 .maxAge(3600 * 24);
 }
​
}
复制代码

之前已经实现了静态资源和解决跨域问题的配置。我们可以重写WebMvcConfigurer的addInterceptors方法来实现拦截器:

@Override
public void addInterceptors(InterceptorRegistry registry) {
​
}
复制代码

我们只需要通过registry.addInterceptor( )添加一个拦截器即可

实现拦截器

新建一个RequestInterceptor.java,实现HandlerInterceptor接口,如下:

@Component
public class RequestInterceptor implements HandlerInterceptor {
​
​
}
复制代码

这里别忘了加上Component注解。

我们可以通过接口的方法列表查看下,我们可以实现那些功能:

【快学springboot】12.实现拦截器

可以看到,我们可以实现preHandle、postHandle和afterCompletion这三个方法。

preHandle

preHandle 方法,通过字面意思不难理解,此方法会在处理每个请求之前先执行。此方法的返回一个布尔值,如果返回为false ,表示请求结束。我们重写该方法,直接返回一个false:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
 System.out.println("请求进来了");
 return false;
}
复制代码

并且把该拦截器在WebConfig中进行注册:

【快学springboot】12.实现拦截器

这时候启动项目,拦截器已经可以起作用了,不过这时候访问会没有返回,我们可以通过response来返回一些信息,如下:

【快学springboot】12.实现拦截器

这时候,直接访问项目根路径:

【快学springboot】12.实现拦截器

查看控制台

【快学springboot】12.实现拦截器

如果有全局异常捕获的话,我们还可以通过抛出异常的形式来返回值。

postHandle

这个方法是处理请求之后,但是在返回数据之前执行的。我们可以通过这样一个方法(这个方法是之前文章里有的啦)来验证,在return处打一个端点:

@PostMapping
public Object addUser() {
 Map<String, String> map = new HashMap<>();
 map.put("name", "happyjava");
 return "OK";
}
复制代码

实现postHandle方法,如下:

运行程序,请求接口:

【快学springboot】12.实现拦截器

在断点处停了下来,但是并没有看到控制台输出了“执行了postHandle”。

afterCompletion

顾名思义,这个方法实在处理完成并且返回结果之后执行的。这个方法更多是用来关闭一些资源的吧,比如ThreadLocal,日志MDC之类的。实现afterCompletion方法如下:

【快学springboot】12.实现拦截器

我们在sout出打一个断点,然后发起接口请求。效果如下:

【快学springboot】12.实现拦截器

线程在断点处停止了,但是请求已经拿到了数据。不过需要注意的是,如果在处理请求出现异常的时候,该方法还是会在返回数据之前执行的(Exception参数就是给我们处理异常用的),并且你可以拿到执行时所抛出的异常信息(没有配置异常拦截器的话,如果配置饿了异常拦截器,ex会为null,所以我们需要先把全局异常拦截器去掉)。修改controller方法如下:

@PostMapping
 public Object addUser() {
 // 新增一个用户
 Map<String, String> map = new HashMap<>();
 map.put("name", "happyjava");
 throw new RuntimeException();
 // return "OK";
}
复制代码

使他抛出一个异常。然后执行请求:

【快学springboot】12.实现拦截器

只是后,postman还在等待数据,并且程序执行到了断点处。并且可以看到,ex就是我们手动抛出的异常。

【快学springboot】12.实现拦截器

把断点放掉,postman成功拿到了数据。其实我们也可以通过这个来做一个全局异常处理器,不过完全没有这个必要性。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C++ Primer 中文版(第 4 版)

C++ Primer 中文版(第 4 版)

Stanley B.Lippman、Josée LaJoie、Barbara E.Moo / 李师贤、蒋爱军、梅晓勇、林瑛 / 人民邮电出版社 / 2006 / 99.00元

本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。本版对前一版进行了彻底的修订,内容经过了重新组织,更加入了C++ 先驱Barbara E. Moo在C++教学方面的真知灼见。既显著改善了可读性,又充分体现了C++语言的最新进展和当......一起来看看 《C++ Primer 中文版(第 4 版)》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具