SpringBoot - Interceptor 拦截器(Interceptor): 用于在某个方法被访问之前进行拦截,然后在方法执行之前或之后加入某些操作,其实就是AOP的一种实现策略。它通过动态拦截Action调用的对象,允许开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。 拦截器的使用场景越来越多,尤其是面向切片编程流行之后。那通常拦截器可以做什么呢? 之前我们在Agent介绍中,提到过统计函数的调用耗时。这个思路其实和AOP的环绕增强如出一辙。 那一般来说,场景如下:
1、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。
2、权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面; 3、函数增强:比如对一个函数进行参数检查,或者结果过滤等。甚至可以对函数就行权限认证。
4、性能监控:统计函数性能,有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录);
5、通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现
1.自定义个interceptor要实现HandlerInterceptor接口重写对应的三个方法
2.注册自定义的拦截器到配置中(extends WebMvcConfigurationSupport 重写addInterceptors 方法)
package spring.interceptor;
import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor-afterCompletion..");
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception{
System.out.println("MyInterceptor-postHandle..");
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor-prehandle..");
return true;// true - 才会继续执行
}
}
@Configuration
public class WebConfig extends WebMvcConfigurationSupport{
@Bean
public MyInterceptor getMyIterceptor(){
return new MyInterceptor();
}
@Bean
public MyInterceptor1 getMyIterceptor1(){
return new MyInterceptor1();
}
@Override
protected void addInterceptors(InterceptorRegistry registry) {
//拦截器的顺序 就是这个配置的顺序
registry.addInterceptor(getMyIterceptor()).addPathPatterns("/*");
registry.addInterceptor(getMyIterceptor1()).addPathPatterns("/*");
// registry.addInterceptor(getMyIterceptor1()).excludePathPatterns();exclude URLs
}
}