拦截器
请求处理过程解析
拦截器简介
- 拦截器(Interceptor) 是一种动态拦截方法调用的机制
- 作用:
- 在指定的方法调用前后执行预先设定后的代码
- 阻止原始方法的执行
- 核心原理:AOP思想
- 拦截器链:多个拦截器按照一定的顺序,对原始被调用功能进行增强
拦截器VS过滤器
- 归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术
- 拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强
拦截器的作用
- 就是增强方法
拦截器开发入门
- 实现HandlerInterceptor接口
- 配置拦截器
- 配置执行位置
- 配置拦截器执行类
- 注意:配置顺序为先配置执行位置,后配置执行类
拦截器执行流程
拦截器参数
- 前置处理方法:原始方法之前运行
public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return true;
}
- 参数
- request: 请求对象
- response:响应对象
- handler: 被调用的处理器对象,本质上是一个方法对象,对反射中的Method对象进行了再包装
- 返回值
- 返回值为false,被拦截的处理器将不执行
- 后置处理方法:原始方法运行后运行,如果原始方法被拦截,则不执行
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
-
参数
- modelAndView:如果处理器执行完成具有返回结果,可以读取到对应数据与页面信息,并进行调整
-
完成处理方法:拦截器最后执行的方法,无论原始方法是否执行
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) throws Exception {
System.out.println("afterCompletion");
}
- 参数:
- ex:如果处理器执行过程中出现异常,可以针对异常情况进行单独处理
拦截器配置项
拦截器链配置
责任链模式
- 责任链模式是一种行为模式
- 特征:
- 沿着一条预先设定的任务链顺序执行,每个节点具有独立的工作任务
- 优势:
独立性:只关注当前节点的任务,对其他任务直接放行到下一节点
隔离性:具备链式传递特征,无需知晓整体链路结果,只需等待请求到达后进行处理即可
灵活性:可以任意修改链路结构动态新增或删减整体链路责任
解耦:将动态任务与原始任务解耦 - 弊端:
链路过长时,处理效率低下
可能存在节点上的循环引用现象,造成死循环,导致系统崩溃