SpringMVC:详述拦截器
将堆内存SpringMVC使用拦截器对请求进行拦截处理,以实现特定的功能:
具体实现:
1、自定义一个实现HandlerInterceptor接口的类并实现接口中定义的抽象方法(实现了三个方法,分别处理Handler Method方法执行前、执行后以及渲染视图后的操作)
package com.zzj.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 MyInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//该方法在Handler Method之前被调用
//作用:常用于实现权限
System.out.println("preHandle"); return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//该方法在Handler Method之后,渲染视图之前
//常用于对请求域中的属性或视图做出修改
System.out.println("postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//该方法在渲染视图之后被调用
//作用:常用于释放资源
System.out.println("afterCompletion"); } }
2、 配置拦截器
a、所有请求
<mvc:interceptors>
<bean class="com.zzj.interceptor.MyInterceptor"></bean>
</mvc:interceptors>
b、特定请求
<mvc:interceptors> <mvc:interceptor>
<!--
mvc:exclude-mapping用于设置不拦截哪些路径的请求;mvc:mapping用于设置拦截哪些路径的请求,如下例子:
/userinfo只拦截/userinfo请求,不拦截/userinfo/toView.do请求
/userinfo/*拦截/userinfo/xxx请求
-->
<mvc:mapping path="/userinfo/*"/>
<bean class="com.zzj.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
拦截器的执行过程分析:
我们在发送一个请求后必定会执行DispatchServlet中的doDispatch方法,而在执行如下方法的顺序我们来分析一下:
preHandle方法(在Handler Method方法执行前调用。功能举例:校验、实现权限等)
通过标蓝代码我们可以看到preHandle在Handler Method之前执行,
mappedHandler.applyPreHandle(processedRequest, response)执行的也就是我们创建的拦截器里的preHandler方法,
我们可以在该方法里通过返回boolean的值来决定是打回请求(拒绝访问),还是继续执行之后的步骤。
postHandle方法(在Handler Method方法执行后,渲染视图前调用。功能举例:加签名,印章等)
标蓝部分即postHandlle的执行,可见他在Handler Method之后执行,而在processDispatchResult(该方法里将会进行视图渲染,详见下方法图)之前执行
afterCompletion方法(在渲染视图之后被调用。功能举例:释放资源)
由上方法介绍可知,之后会执行processDispatchResult方法,我们找到该方法,可见render方法,该方法我们在自定义视图的博客中介绍过,是用来进行渲染视图的
在渲染视图后,才会执行afterCompletion方法