文章目录
1. 拦截器概念
动态拦截Actioon调用的对象,使开发者在一个Actioon执行的前后执行一段代码,也可以在Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。
2. 作用
动态拦截Action调用的对象(也就是实际项目中的controller层的接口)
3. 适用场景
3.1. 用户登录校验
3.2. 资源拦截,阻止访问
4. 实现拦截器
实现拦截器需要实现HandlerInterceptor接口,HandlerInterceptor接口中有三个方法preHandle、postHandle、afterCompletion。
4.1. preHandle
在Action执行前调用
4.2. postHandle
在Action执行后调用,生成视图前调用
4.3. afterCompletion
在DispatcherServlet完全处理完请求之后被调用,可用于清理资源
4.4. 具体实现
4.4.1. 、配置拦截器
定义一个配置类实现WebMvcConfigurer接口,重写addCorsMappings()方法和addInterceptors()方法
@Configuration //标识这是一个配置类
public class AuthConfig implements WebMvcConfigurer {
@Autowired
private GatewayRequestInterceptor gatewayRequestInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册gatewayRequestInterceptor拦截器(gatewayRequestInterceptor是我们自己自定义的拦截器类)
registry.addInterceptor(gatewayRequestInterceptor);
}
}
4.4.2. 、自定义拦截器
定义一个拦截器实现HandlerInterceptor接口,或者继承HandlerInterceptorAdapter,重写preHandle()方法
@Component
public class GatewayRequestInterceptor implements HandlerInterceptor {
private static final Logger log = LoggerFactory.getLogger(GatewayRequestInterceptor.class);
public GatewayRequestInterceptor() {
}
/**
* 在请求处理之前进行调用(Controller方法调用之前),编写请求处理之前的校验逻辑
* return true,请求将会继续执行后面的操作
* return false,请求被拦截,将不会请求后续的操作
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
}
5. 拦截器链
可以在拦截器具体实现的第一步【配置拦截器】中添加多个自定义拦截器。
@Configuration
public class AuthConfig implements WebMvcConfigurer {
@Autowired
private GatewayRequestInterceptor gatewayRequestInterceptor;
@Autowired
private GatewayLoginInterceptor gatewayLoginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//拦截器1、注册gatewayLoginInterceptor拦截器(gatewayLoginInterceptor是我们自己自定义的拦截器类)
registry.addInterceptor(gatewayLoginInterceptor);
//拦截器2、注册gatewayRequestInterceptor拦截器(gatewayRequestInterceptor是我们自己自定义的拦截器类)
registry.addInterceptor(gatewayRequestInterceptor);
}
}