一般说到拦截器我们就想到实现HandlerInterceptor,并同时配置拦截器的顺序和拦截条件即可。这种属于MVC的拦截器。如下
@Component
public class LoginInterceptor implements HandlerInterceptor {
/**
-
拦截器为调用方法执行之前执行的方法
-
@param request 请求
-
@param response 响应
-
@param handler 表示要执行的处理器, 即处理请求的 Controller 对象或者是拦截器的对象
-
@return true 拦截器验证成功, 继续执行后续操作
-
false 拦截器验证失败, 验证未通过后续流程不执行
-
@throws Exception 异常
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 用户登录判断 HttpSession session = request.getSession(false); if (session != null && session.getAttribute("session_userinfo") != null) { // 该用户已经登陆 return true; } // 请求无权限, 返回状态码提示 response.setStatus(401); return false; }
}
@Configuration
public class MyInterceptorConfig implements WebMvcConfigurer {
// 将自定义的拦截器注入
@Autowired
private LoginInterceptor interceptor;
/**
-
@param registry 注册对象
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {// 注册对象将拦截器添加进框架中 registry.addInterceptor(interceptor) // 配置拦截规则 .addPathPatterns("/**") // 拦截所有的 url .excludePathPatterns("/user/reg") // 排除用户注册 url .excludePathPatterns("/user/login") // 排除用户登陆 url .excludePathPatterns("/image/**"); // 排除 image 文件夹底下的所有文件 }
}
但是实际开发过程中,会有一些特殊的拦截需求
第一种,拦截某些特定的方法,
例子:
public class KafkaListenerInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
//执行前要做的。
setShardedCode(invocation);
return invocation.proceed();
}
private void setShardedCode(MethodInvocation invocation) {
//执行前要做的。
}
}
配置
shardedDataSourceHelperBiz
defaultShardedDataSourceInterceptor
第二种,对所有的请求过滤,当然此处也可以使用其他过滤器,这种事比较针对的
ublic class RestRequestFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
}
}
第三种:对所有对外访问的请求进行拦截,主要针对对外访问时请求头的处理
public class RestRequestInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
HttpHeaders headers = request.getHeaders();
headers.add(“locale”, messageConfig.getLocaleString());
return execution.execute(request, body);
}