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

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

内容简介:之前在下面,我们就通过代码,使用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成功拿到了数据。其实我们也可以通过这个来做一个全局异常处理器,不过完全没有这个必要性。


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

查看所有标签

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

Agile Web Development with Rails 4

Agile Web Development with Rails 4

Sam Ruby、Dave Thomas、David Heinemeier Hansson / Pragmatic Bookshelf / 2013-10-11 / USD 43.95

Ruby on Rails helps you produce high-quality, beautiful-looking web applications quickly. You concentrate on creating the application, and Rails takes care of the details. Tens of thousands of deve......一起来看看 《Agile Web Development with Rails 4》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

MD5 加密
MD5 加密

MD5 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具