第一种方式是要定义的Interceptor类要实现了Spring 的HandlerInterceptor 接口,或者是这个类继承实现了HandlerInterceptor 接口的类,比如抽象类HandlerInterceptorAdapter ;
第二种方式是实现Spring的WebRequestInterceptor接口,或者是继承实现了WebRequestInterceptor的类。
一、编写拦截器类实现HandlerInterceptor接口
@Configuration
public class ApiInterceptor implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(ApiInterceptor.class);
//拦截器的执行是在spring容器中bean初始化之前的,拦截器执行时,spring中我们定义的bean还未初始化,自然也就无法自动注入,无法使用
@Autowired
private IRedisService redisService;
/**
* 预处理回调方法,实现处理器的预处理(如检查登陆),第三个参数为响应的处理器,自定义Controller
* 返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 如果不是映射到方法直接通过
if (!(handler instanceof HandlerMethod)) {
return true;
}
//设置编码格式
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json;charset=UTF-8");
// 处理逻辑
// ..............
String resultStatus = JSONObject.fromObject(new
RespCodeEntity(RespCode.TOKEN_CONFLICT)).toString();
PrintWriter out = response.getWriter();
out.write(resultStatus);
out.flush();
out.close();
return false;
}
/**
* 后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception {
}
/**
* 整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e)
throws Exception {
}
}
一、配置拦截器
@Configuration
public class WebAppConfig implements WebMvcConfigurer {
// 将拦截器bean化
@Bean
public ApiInterceptor getApiInterceptor() {
return new ApiInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(/*new APIInterceptor()*/getApiInterceptor())
.addPathPatterns("/**").excludePathPatterns("/user/login", "/user/register", "/user/verifyCode", "/user/upSoftware");
}
/* @Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/index").setViewName("index");
}*/
}
// WebMvcConfigurerAdapter 过时替代的方式:
// 1. JavaBean配置WebMvcConfigurer https://www.jianshu.com/p/77482f0b59e9
/* 2. @Configuration
public class WebMvcConfg extends WebMvcConfigurationSupport {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/index").setViewName("index");
}
}*/
代码注释已经解释很清楚了。