文章目录
SpringMvc拦截器
概念与作用
**概念:**拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行。使用了AOP思想,拦截器性质上也是切面类。
作用:
- 在指定的方法调用前后执行预先设定的代码
- 阻止原始方法的执行
- 总结:增强
Interceptor与Filter区别:
- Fliter属于Servlet技术,对所有的访问进行增强或拦截。
- Interceptor属于SpringMvc,只对SpringMvc的访问进行处理。
定义拦截器
使用步骤:
搭建环境(导入servlet与SpringMvc依赖)
创建SpringMvc配置类/文件
@Configuration //同时扫描控制器和配置类所在的包 @ComponentScan({ "com.lxl.controller","com.lxl.config"}) @EnableWebMvc //使用拦截器需要添加这个注解。不建议使用实现接口的配置方式,两种方式只能配置一种,否则有冲突 public class SpringMvcConfig { }
定义web容器初始化类
// Tomcat在启动时会创建这个类的对象,运行在Servlet之前 public class ServletConfigInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override // 加载Spring的配置类 protected Class<?>[] getRootConfigClasses() { return new Class[0]; } @Override // 加载SpringMVC的配置类 protected Class<?>[] getServletConfigInitializerClasses() { return new Class[]{ SpringMvcConfig.class}; } @Override //配置接受SpringMVC管理的访问路径 protected String[] getServletMappings() { return new String[]{ "/"}; } }
创建控制器、定义拦截器
@RestController @RequestMapping("/book") public class BookController { @RequestMapping("/find") public String find() { System.out.println("查找书籍"); return "find success"; } } public class BookInterceptor implements HandlerInterceptor { //定义拦截器类,实现HandlerInterceptor接口 @Override //原始方法调用前执行的内容 //返回值类型可以拦截控制的执行,true放行,false终止 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("前置通知"); return true; } @Override //原始方法调用后执行的内容 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("后置通知"); } @Override //原始方法调用完成后执行的内容 //无论处理器方法内部是否出现异常,该方法都会执行。 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("最终通知"); } }
配置加载拦截器
@Configuration //SpringMvc副配置类 public class SpringMvcSupport extends WebMvcConfigurationSupport { @Override protected void addInterceptors(InterceptorRegistry registry) { //注解拦截器和拦截地址 registry.addInterceptor(new BookInterceptor()).addPathPatterns("/book/*"); //*代表只拦截一层,**代表拦截任意层 } }
拦截执行流程
拦截器方法参数
- HttpServletRequest request 请求参数
- HttpServletResponse response 响应参数
- Object handler 被调用的处理器对象,本质上是一个方法对象,对反射技术中的Method对象进行了再包装,可以转为HandlerMethod类型
- modelAndView 如果处理器执行完成具有返回结果,可以读取到对应数据与页面信息,并进行跳转
- Exception ex 如果处理器执行过程中出现异常对象,可以针对异常情况进行单独处理
拦截器链规则
//配置第二个拦截器
public class BookInterceptor2 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器2:前置通知");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println(<