1 概念
1.1 springmvc中的拦截器,相当于是servlet中的过滤器
1.2 主要用于拦截用户请求,并做相应的处理
2具体实现
package com.fhzheng.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 以实现接口的方式定义拦截器
*/
public class Interceptor1 implements HandlerInterceptor {
@Override
public boolean **preHandle**(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("Intercepter1...preHandle");
return true;
}
@Override
public void **postHandle**(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("Intercepter1...postHandle");
}
@Override
public void **afterCompletion**(HttpServletRequest request,
HttpServletResponse response, Object handler,
Exception ex) throws Exception {
System.out.println("Intercepter1...afterCompletion");
}
}
这里的preHandler方法,会在控制器方法前执行,返回值表示是否中断后续操作。
返回真,继续向下执行
返回假,中断后续的所有操作
一般进行数据验证,格式调整等,用户登录验证等动作
这里的postHandler方法,会在控制器方法调用后,且解析视图之前执行
一般可以通过它对视图做进一步的修改动作
这里的afterCompletion方法,会在整个请求完成之后,即视图渲染结束之后执行
一般此方法用于实现一些资源清理、日志记录等工作
3配置节点
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 定义具体的一个拦截器顺序:mapping...exclude-mapping...bean -->
<mvc:interceptor>
<!-- 拦截器作用的路径 /**表示拦截所有路径 -->
<mvc:mapping path="/**" />
<!-- 拦截器位置指定 -->
<bean class="com.fhzheng.core.interceptor.LoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
<!-- 配置拦截器 -->
<mvc:interceptors>
<!--使用bean直接定义在<mvc:interceptors>下面的拦截器将拦截所有请求-->
<!-- <bean class="com.fhzheng.interceptor.CustomInterceptor"/> -->
<!-- 拦截器1 -->
<mvc:interceptor>
<!-- 配置拦截器作用的路径 -->
<mvc:mapping path="/**" />
<!-- 定义在<mvc:interceptor>下面的表示匹配指定路径的请求才进行拦截的 -->
<bean class="com.fhzheng.interceptor.Interceptor1" />
</mvc:interceptor>
<!-- 拦截器2 -->
<mvc:interceptor>
<!-- 配置拦截器作用的路径:只拦截以/hello结尾的路径 -->
<mvc:mapping path="/hello" />
<bean class="com.fhzheng.interceptor.Interceptor2" />
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.fhzheng.interceptor.LoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
4 当有多个拦截器时,它的执行顺序类似于多个过滤器
比如有2个
InterceptorA
InterceptorA
则执行顺序是
A.preHandler()
B.preHandler()
HanderAdapter()【控制器方法执行】
B.postHandler()
A.postHandler()
DispatcherServlet【前端serlvet】
B.afterCompletion
A.afterCompletion
即最先拦截的,最后放行
本文深入探讨SpringMVC中的拦截器机制,包括其与过滤器的区别,如何通过实现HandlerInterceptor接口来创建拦截器,以及预处理(preHandle)、后处理(postHandle)和完成处理(afterCompletion)方法的作用。同时,介绍了在SpringMVC配置文件中如何定义和应用拦截器。
523

被折叠的 条评论
为什么被折叠?



