简介
拦截器是spring中的概念和过滤器类似,都可以处理请求和相应。但对过滤器而言,它更处理对更细致些,可以从三个方向进行拦截处理。
- perHandle 在控制器访问之前执行代码,作用:通用代码执行,有权放行,终端请求。
- postHandle 在控制器访问之后,跳转完成之前,执行对代码。作用:修改跳转路径。
- afterCompletion 在控制器完成跳转之后,跳转到jsp之后,作用:没有什么作用,释放资源对事
创建
1.创建MyInterceptor1 拦截器
//@Component 和 @Service 作用一样:创建对象
@Component
@Slf4j
public class MyInterceptor1 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("拦截器1 在控制器前执行");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
log.info("拦截器1 在控制器后执行");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
log.info("拦截器1 最后执行");
}
}
2.创建MyInterceptor2 拦截器
@Component
@Slf4j
public class MyInterceptor2 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("拦截器2 在控制器前执行");
//int a = 1/0;
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
log.info("拦截器2 在控制器后执行");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
log.info("拦截器2 最后执行");
}
}
在postHandle方法中有一个参数是ModelAndView。这个对象在SpringMvc中是一个关键对象,可以进行参数传递和路径跳转通过ModelAndView 我们可以在 postHandle方法中 操作作用域的值 和 设置修改跳转路
3.加入配置
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor1 myInterceptor1;
@Autowired
private MyInterceptor2 myInterceptor2;
/**
* 注册拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor2)
.addPathPatterns("/hello")
.order(1);
registry.addInterceptor(myInterceptor1)
.addPathPatterns("/hello","/interceptor-test")
.excludePathPatterns("/test")
.order(5);
}
}
- 1.在注册拦截器的时候 配置拦截路径的addPathPatterns参数为可变长参数,就意味着可以接受String的数组,可以配置多个参数
- 2.在不做任何设置的时候,多个拦截器的执行顺序和注册的顺序有关,先注册的先执行也可以通过Order方法来设置 执行的顺序 值越小越先执行