网站首页 > java教程 正文
前言
之前在【快学springboot】6.WebMvcConfigurer配置静态资源和解决跨域里有用到WebMvcConfigurer接口来实现静态资源的映射和解决跨域请求,并且在文末还说了WebMvcConfigurer(springboot2.x之后使用该接口,springboot1.x使用WebMvcConfigurerAdapter类,不过该类已经被标识过期了)可以配置很多东西,如下:
下面,我们就通过代码,使用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注解。
我们可以通过接口的方法列表查看下,我们可以实现那些功能:
可以看到,我们可以实现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中进行注册:
这时候启动项目,拦截器已经可以起作用了,不过这时候访问会没有返回,我们可以通过response来返回一些信息,如下:
这时候,直接访问项目根路径:
查看控制台
如果有全局异常捕获的话,我们还可以通过抛出异常的形式来返回值。
postHandle
这个方法是处理请求之后,但是在返回数据之前执行的。我们可以通过这样一个方法(这个方法是之前文章里有的啦)来验证,在return处打一个端点:
@PostMapping public Object addUser() { Map<String, String> map = new HashMap<>(); map.put("name", "happyjava"); return "OK"; }
实现postHandle方法,如下:
运行程序,请求接口:
在断点处停了下来,但是并没有看到控制台输出了“执行了postHandle”。
afterCompletion
顾名思义,这个方法实在处理完成并且返回结果之后执行的。这个方法更多是用来关闭一些资源的吧,比如ThreadLocal,日志MDC之类的。实现afterCompletion方法如下:
我们在sout出打一个断点,然后发起接口请求。效果如下:
线程在断点处停止了,但是请求已经拿到了数据。不过需要注意的是,如果在处理请求出现异常的时候,该方法还是会在返回数据之前执行的(Exception参数就是给我们处理异常用的),并且你可以拿到执行时所抛出的异常信息(没有配置异常拦截器的话,如果配置饿了异常拦截器,ex会为null,所以我们需要先把全局异常拦截器去掉)。修改controller方法如下:
@PostMapping public Object addUser() { // 新增一个用户 Map<String, String> map = new HashMap<>(); map.put("name", "happyjava"); throw new RuntimeException(); // return "OK"; }
使他抛出一个异常。然后执行请求:
只是后,postman还在等待数据,并且程序执行到了断点处。并且可以看到,ex就是我们手动抛出的异常。
把断点放掉,postman成功拿到了数据。其实我们也可以通过这个来做一个全局异常处理器,不过完全没有这个必要性。
猜你喜欢
- 2024-11-04 Spring Boot 中的拦截器和过滤器到底有什么区别?
- 2024-11-04 SpringBoot中的过滤器和拦截器有什么区别?
- 2024-11-04 为什么你写的拦截器注入不了Java bean?
- 2024-11-04 使用Spring Cloud Zuul实现过滤器或拦截器功能案例
- 2024-11-04 java服务-springboot拦截器实现用户登录Token及权限校验
- 2024-11-04 JAVAEE就业工程师教程之第4章 Struts2拦截器
- 2024-11-04 Spring框架功能分为哪些模块?(spring框架有哪几部分组成)
- 2024-11-04 高级码农Spring Boot实战进阶之过滤器、拦截器的使用
- 2024-11-04 轻量级 Java 权限认证框架Sa-Token初体验(五)
- 2024-11-04 一个拦截器和一个awk命令,秒查线上超时接口
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)