文章目录
- 拦截器
- 拦截器基本介绍
- 拦截器快速入门
- 拦截器参数
拦截器
拦截器基本介绍
拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行
作用:
在指定的方法调用前后执行预先设定的代码
阻止原始方法的执行(例如权限管理)
执行流程:
拦截器与过滤器的区别:
归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术
拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强
拦截器快速入门
案例需求:
制作拦截器功能类;
配置拦截器的执行位置
实现步骤如下:
创建拦截器功能类ProjectInterceptor实现HandlerInterceptor接口, 并声明为bean; 推荐在controller包下创建一个interceptor, 在该包下写拦截器功能类
@Component
public class ProjectInterceptor implements HandlerInterceptor {
@Override
// 原始方法执行之前执行的操作
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
// 如果return的是false表示终止原始方法执行, 以及终止原始方法执行之后的拦截器操作
return true;
}
@Override
// 原始方法执行之后执行的操作
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
@Override
// 原始方法执行完成之后, 且在postHandle方法执行之后执行的操作
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}
定义配置类,继承WebMvcConfigurationSupport,实现addInterceptor方法(注意:扫描加载配置)
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
@Autowired
private ProjectInterceptor projectInterceptor;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
// 设置访问哪个路径时使用哪个拦截器
registry.addInterceptor(projectInterceptor).addPathPatterns("/books");
}
}
SpringMvcConfig中加载SpringMvcSupport配置类
@Configuration
@ComponentScan({"com.chenyq.controller", "com.chenyq.config"})
@EnableWebMvc
public class SpringMvcConfig {
}
目前拦截器可以拦截所有访问/users的请求, 但是/users/100这样路径的请求并不会拦截; 添加拦截器并设定拦截的访问路径,路径可以通过可变参数设置多个, 我们可以在配置一个路径用于拦截类似于/users/100这样的路径
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
@Autowired
private ProjectInterceptor projectInterceptor;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
// 设置访问哪个路径时使用哪个拦截器
registry.addInterceptor(projectInterceptor).addPathPatterns("/users", "/users/*");
}
}
配置类简化开发: 让SpringMvcConfig核心配置类, 实现标准接口WebMvcConfigurer简化开发(注意:侵入式较强)
@Configuration
@ComponentScan("com.chenyq.controller")
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {
@Autowired
private ProjectInterceptor projectInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(projectInterceptor).addPathPatterns("/users", "/users/*");
}
}
拦截器执行流程:
拦截器参数
前置处理:
参数:
- request:请求对象
- response:响应对象
- handler: 描述的是对原始方法的封装,本质上是一个方法对象,对反射技术中的Method对象进行了再包装, 获取handler对象就可以操作原始执行的方法
返回值:
- 返回值为false,被拦截的处理器将不执行
@Override
// 原始方法执行之前执行的操作
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
System.out.println("preHandle");
return true;
}
后置处理:
参数
- request和response参数与前置处理一样
- modelAndView: 如果处理器执行完成具有返回结果,可以读取到对应数据与页面信息,并进行调整
@Override
// 原始方法执行之后执行的操作
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
完成后处理:
参数:
- request和response参数与前置处理一样
- ex: 如果处理器执行过程中出现异常对象,可以针对异常情况进行单独处理
@Override
// 原始方法执行完成之后, 且在postHandle方法执行之后执行的操作
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}