Spring MVC(六)拦截器
程序员文章站
2022-07-09 22:42:27
...
一 介绍
public interface HandlerInterceptor {
boolean preHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;
void postHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3, ModelAndView var4) throws Exception;
void afterCompletion(HttpServletRequest var1, HttpServletResponse var2, Object var3, Exception var4) throws Exception;
}
HandlerInterceptor接口 ,有3个方法:
preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如我们上一章的Controller实现);
返回值:
- true表示继续流程(如调用下一个拦截器或处理器);
- false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;
postHandle:后处理回调方法,实现处理器的后处理(但在渲染视图之前
),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。
afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时
回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true
的拦截器的afterCompletion。
拦截器总结
- 在preHandler中return false,则postHandle、afterCompletion都不会执行
- 在handler中抛出异常,则afterCompletion会执行,postHandle不执行(无论是否有ExceptionHandler)
- 正常运行,则postHandle、afterCompletion两个方法都会执行。
适配器
有时候我们可能只需要实现三个回调方法中的某一个,如果实现HandlerInterceptor接口的话,三个方法必须实现,不管你需不需要,此时spring提供了一个HandlerInterceptorAdapter适配器(一种适配器设计模式的实现-接口适配器模式),允许我们只实现需要的回调方法。
public abstract class HandlerInterceptorAdapter implements HandlerInterceptor {
//省略代码 此处所以三个回调方法都是空实现,preHandle返回true。
}
二 运行流程
正常流程
中断流程
三 实践
代码实现
public class HandlerInterceptor1 extends HandlerInterceptorAdapter {//此处一般继承HandlerInterceptorAdapter适配器即可
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("===========HandlerInterceptor1 preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("===========HandlerInterceptor1 postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("===========HandlerInterceptor1 afterCompletion");
}
}
配置
<bean name="/test" class="cn.javass.chapter5.web.controller.TestController"/>
<bean id="handlerInterceptor1"
class="cn.javass.chapter5.web.interceptor.HandlerInterceptor1"/>
<bean id="handlerInterceptor2"
class="cn.javass.chapter5.web.interceptor.HandlerInterceptor2"/>
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="handlerInterceptor1"/>
<ref bean="handlerInterceptor2"/>
</list>
</property>
</bean>
参考
推荐阅读
-
Spring MVC源码(一) ----- 启动过程与组件初始化
-
javaweb各种框架组合案例(六):springboot+spring data jpa(hibernate)+restful
-
Spring MVC的常用注解
-
[读书笔记] Spring MVC 学习指南 -- 第一章
-
Spring mvc 分步式session的实例详解
-
Spring MVC自定义日期类型转换器实例详解
-
从原理层面掌握@SessionAttribute的使用【一起学Spring MVC】
-
.NET MVC5简介(六)HttpHandler
-
Intellij IDEA 2019 + Java Spring MVC + Hibernate学习笔记(1)
-
spring MVC扩展和SSM整合