拦截器
- 拦截器(Interceptor)是一种动态的拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行
- 作用:
- 在指定方法调用前后执行预先设定的代码
- 阻止原始方法的执行
就好像电影院里检票发3D眼镜的大叔大妈一样。
拦截器与过滤器的区别
- 归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术
- 拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强
拦截器的设置
- 制作拦截器功能类
- 配置拦截器的执行位置
功能类需要继承HandlerInterceptor
接口并实现三个方法如下:
@Component
public class ProjectInterceptor implements HandlerInterceptor {
/**
* 处理器执行之前调用
* @param request HttpServletRequest对象,可以获取请求参数等等
* @param response HttpServletResponse对象
* @param handler 拦截器的Controller对象
* @return 如果返回false,就会中断处理流程,不会处理后续的拦截器和Controller。如果返回true,则会执行后续的拦截器和处理器
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return HandlerInterceptor.super.preHandle(request, response, handler);
}
/**
* 处理器执行之后调用,跳转到指定视图之前调用
* @param request HttpServletRequest对象
* @param response HttpServletResponse对象
* @param handler 拦截器的Controller对象
* @param modelAndView ModelAndView对象,其中存放的是处理结果和视图的信息
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
/**
* 请求处理完成之后调用
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
- 配置拦截器拦截路径的方法为:
- 使SpringMVC配置类继承
WebMvcConfigurer
接口,并实现其中的addInterceptors()
方法 - 在
addInterceptors()
方法中添加需要拦截的路径即可
- 使SpringMVC配置类继承
@Configuration
@EnableWebMvc
@ComponentScan("org.YD.controller")
public class SpringMvcConfig implements WebMvcConfigurer {
@Autowired
private ProjectInterceptor projectInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(projectInterceptor).addPathPatterns("/users","/users/*");
}
}
拦截器功能类中的参数
- request HttpServletRequest对象
- 可以获取请求参数等等
- response HttpServletResponse对象
- 可以在响应中添加数据
- handler 拦截器的Controller对象
- 可以获取请求目标的信息
- modelAndView ModelAndView对象
- 其中存放的是处理结果和视图的信息
- 通常用来完成资源重定向
拦截器链的配置
- 可以在一个项目中配置多个拦截器,他们之间的关系类似于嵌套,我们称之为拦截器链
- 拦截器链的执行顺序与配置拦截路径时的顺序相同
如下代码就代表projectInterceptor
嵌套projectInterceptor2
。
@Autowired
private ProjectInterceptor projectInterceptor;
@Autowired
private ProjectInterceptor2 projectInterceptor2;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(projectInterceptor).addPathPatterns("/users","/users/*");
registry.addInterceptor(projectInterceptor2).addPathPatterns("/users","/users/*");
}