1 定义interceptor
直接上代码:
@Slf4j
@Component
public class MyInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object object) throws Exception {
//do something
// return true, 正常流程执行
// return false, 则中断执行
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object object, ModelAndView model){
//do something.
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object object, Exception arg3){
//do something
}
}
“`
“`
这个三个方法的处理时机有所不同:
- preHandle: 发生在真正的处理逻辑之前
- postHandle: 发生在处理逻辑之后
- afterComplete: 整个请求处理完毕回调方法
2. 注册
@Configuration
public class AppConfig extends WebMvcConfigurerAdapter {
@Autowired
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor);
registry.addInterceptor(localeChangeInterceptor());
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName("lang");
return lci;
}
}
这里使用了两种声明和定义的方法,一种在直接基于@Autowired来实现注入,第二种是基于@Bean的方式,进行对象声明。
3. 应用场景
由于Interceptor的特殊性,则其具备以下使用场景:
日志记录
记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。权限检查
如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;- 性能监控
可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间 - 通用行为
读取cookie得到用户信息并将用户对象放入请求,提取Locale、Theme信息等