问题
在项目开发过程中经常需要进行某些拦截:接口拦截以进行权限校验,参数校验等等。
解决
使用HandlerInterceptor定义拦截器,并把拦截器添加到WebMvcConfigurer配置器中。
HandlerInterceptor
Springboot中的拦截器,里面共提供了三种方法。
方法名 | 作用 |
preHandle | 在执行请求之前被调用 |
postHandle | 在处理器处理完请求之后,渲染视图之前被调用 |
afterCompletion | 在处理器处理完请求,并且页面已经渲染后被调用 |
WebMvcConfigurer
里面提供了多种方法,这里只介绍增加拦截器的方法addInterceptors,具体参照代码示例。
代码示例
public class xxxInterceptor implements HandlerInterceptor, WebMvcConfigurer {
//重写preHandle方法,以校验token为例
@Override
public boolean preHandle(@NonNull HttpServletRequest request,
@NonNull HttpServletResponse response,
@NonNull Object handler) {
// 获取token
String token = getToken(request);
// 校验token
if (校验通过) {
return true;
} else {
return false;
}
}
//重写addInterceptors方法
@Override
public void addInterceptors(@NonNull InterceptorRegistry registry) {
InterceptorRegistration registration = registry.addInterceptor(this)
// 使用Spring提供的Ordered,设置为优先级最高
.order(Ordered.HIGHEST_PRECEDENCE)
// 配置排除接口
.excludePathPatterns(需要排除的接口,支持','分隔);
// 配置拦截接口
.addPathPatterns(需要拦截的接口,支持','分隔);
});
}
/**
* 获取缓存中的token
* @param request http
*/
private String getToken(@NonNull HttpServletRequest request) {
return Optional.ofNullable(request.getCookies())
.flatMap(cookies -> Stream.of(cookies)
.filter(it -> "cookie的key".equalsIgnoreCase(it.getName()))
.findFirst())
.map(Cookie::getValue)
.orElse(null);
}
}