拦截器
拦截器最典型的用法是检查用户是否登录,登录后可以执行目标handler方法,未登录则跳转到登录页面。这样的操作要是在每个拦截器内部来写就太麻烦了,统一提取到拦截器中是明智之举。 1.HandlerInterceptor接口 ①preHandle()方法
签名:boolean preHandle(HttpServletRequest, HttpServletResponse, Object) 在执行目标handler方法之前执行,如果返回true,则继续执行后续拦截器和目标handler方法;如果返回false则不执行。注意:返回false时最好借助转发或重定向等方式为客户端提供一个响应页面。 ②postHandle()方法
签名:void postHandle(HttpServletRequest, HttpServletResponse, Object, ModelAndView) 在执行目标handler方法之后、渲染视图之前执行。 ③afterCompletion()方法
在渲染视图之后、返回响应之前执行。 2.HandlerInterceptorAdapter类
实现HandlerInterceptor接口需要把所有抽象方法都实现,而继承HandlerInterceptorAdapter类则可以有选择的重写需要的方法,更加便捷,推荐使用。
3.配置方式 ①拦截所有请求
代码语言:javascript复制<mvc:interceptors>
<bean class="com.interceptor.FirstInterceptor"/>
<bean class="com.interceptor.SecondInterceptor"/>
</mvc:interceptors>
②精确指定拦截的请求
代码语言:javascript复制<mvc:interceptors>
<bean class="com.interceptor.FirstInterceptor"/>
<bean class="com.interceptor.SecondInterceptor"/>
<mvc:interceptor>
<mvc:mapping path="/*"/>
<mvc:exclude-mapping path="/specailPath"/>
<bean class="com.interceptor.SpecialInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
4.多个拦截器的执行顺序
①按正序依次调用preHandle()方法 ②执行目标handler方法 ③按反序调用postHandle()方法 ④按反序调用afterCompletion()方法