SpringMvc拦截器
底层原理:AOP
拦截器与过滤器的区别:
拦截器执行流程:
演示:
在controller包下新增ProjectInterceptor类,实现HandlerInterceptor接口,并重写三个方法。
@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 {
System.out.println("postHandle...");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion...");
}
}
(preHandle方法若返回false,则将使用到拦截器的方法拦截,只执行preHandle方法)
在config包下新增SpringMvcSupport类,用以添加拦截器(projectInterceptor自动注入,SpringMvcConfig要扫到SpringMvcSupport类来)。
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
@Autowired
private ProjectInterceptor projectInterceptor;
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
}
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
}
}
使用Postman测试:
拦截器成功启用。
也可简化开发,将SpringMvcSupport类去掉,让SpringMvcConfig去实现一个接口来重写拦截器的三个方法:
@Configuration
@ComponentScan({"example.controller"})
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {
@Autowired
private ProjectInterceptor projectInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
}
}
效果与先前是一样的。但此写法侵入性较强,使得程序和spring强绑定了。
SpringMvc拦截器参数
其中handle类型为HandleMethod,其中的method属性通过反射封装了当前执行的方法。
其中的modelAndView封装了SpringMvc进行页面跳转的相关对象
ex可获得原始程序执行过程中出现的异常,但ssm整合了统一异常处理机制,故此方法应用较少。
SpringMvc拦截器链配置
多拦截器执行顺序
当一个拦截器运行中断,在其after之前的所有方法都不会执行,直接执行after之后的方法。
演示:
现有拦截器1,2
除了打印的内容不同,其他皆一致。
在SpringMvcSupport中配置拦截器:
拦截器1先执行。
将拦截器2的preHandle的返回值设为false。
使用postman随便调用接口:
拦截器1的preHandle和afterCompletion方法被执行。