拦截器概念
拦截器( Interceptor )是一种动态拦截方法调用的机制 , 在SpringMVC中动态拦截控制器方法的执行
- 作用:
- 在指定的方法调用前后执行预先设定的代码
- 阻止原始方法执行
拦截器与过滤器的区别
- 归属不同: Filter属于Servlet技术, Interceptor属于SpringMVC技术
- 拦截内容不同: Filter对所有访问进行增强, Interceptor仅针对SpringMVC的访问进行增强
拦截器入门案例
1、声明拦截器的bean,并且实现HandlerInterceptor接口(扫描加载bean)
@Component
public class ProjectInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle.....");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
System.out.println("postHandle.....");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
System.out.println("afterCompletion.....");
}
}
2、定义配置类,继承WebMvcConfigurationSupport, 实现addInterceptor方法 (注意:扫描加载配置)
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
//添加拦截器
@Override
protected void addInterceptors(InterceptorRegistry registry) {
。。。
}
}
3、添加拦截器并设定拦截的访问路径,路径可以通过可变参数设置多个
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
@Autowired
private ProjectInterceptor projectInterceptor;
//添加拦截器
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(projectInterceptor).addPathPatterns("/users","/users/*");
}
}
4、使用标准接口WebMvcConfigurer简化开发(注意:侵入式较强)
拦截器执行流程
拦截器参数
拦截器执行顺序
当配置多个拦截器时,形成拦截器链
拦截器链的运行顺序参照拦截器添加顺序为准
当拦截器中出现对原始处理器的拦截,后面的拦截器均终止运行
当拦截器运行中断,仅运行配置在前面的拦截器的afte rCompletion操作