使用场景
处理所有请求的共性问题,例如:
- 解决乱码问题
- 解决权限验证问题
如何使用
- 编写拦截器类TestInterceptor 实现HandlerInterceptor 接口并实现相应方法
// 实现HandlerInterceptor 接口并实现方法
@Component
public class TestInterceptor implements HandlerInterceptor {
// 在请求执行前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 设置编码格式为utf-8
request.setCharacterEncoding("utf-8");
System.out.println("preHandle执行");
return true;
}
// 在请求执行后执行(preHandle必须返回true才会执行到这里)
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle执行");
}
// 视图渲染完成后执行(preHandle必须返回true才会执行到这里),通常用来清理资源
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion执行");
}
}
- 实现WebMvcConfigurer 接口,将拦截器注册进spring容器并定义拦截路径(当注册多个拦截器时,先注册的会先执行)
@Component
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private TestInterceptor testInterceptor;
// 关于拦截路径这里 例如路径:http://localhost:8080/request/test
// 拦截路径为/** =》拦截所有的请求
// 拦截路径为/**/request =》拦截所有尾为request的请求
// 拦截路径为/request/** =》拦截request下的所有请求
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(testInterceptor).addPathPatterns("/**");
}
}
关于拦截路径问题可参考:https://blog.csdn.net/zhou920786312/article/details/81026381
总结
拦截器主要用来处理web请求中的共性问题,
共性问题在拦截器中解决,可以减少重复代码,便于维护