一.概述
SpringMVC提供了拦截器机制,允许运行目标方法之前进行一些拦截工作,或者目标方法运行之后进行一些其他操作。
SpringMVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口。
- preHandle():这个方法在业务处理请求之前被调用,在该方法中对用户请求request进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
- postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet向客户端返回响应前被调用,在该方法中对用户请求request进行处理。
- afterCompletion():这个方法在DispatcherServlet完全处理完请求被调用,可以在这个方法中进行一些资源清理的操作。
二.实验代码
2.1 实现自定义拦截器步骤
- 实现HandlerInterceptor接口
- 在SpringMVC配置文件中注册这个拦截器,配置这个拦截器来拦截哪些请求的目标方法;
2.2 实现单个拦截器
1.自定义拦截器类
package com.test.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/*
*
* 单个 拦截器运行流程:
* 正常运行流程:
* 拦截器的preHandle-->目标方法--->拦截器postHandle-->页面--->拦截器的afterCompletion;
* 其他流程:
* 只要preHandler不放行,就没有其他流程
* 只要放行了 afterCompletion都会执行
* 多个拦截器:
* 异常流程:
* 1、不放行 哪一块不放行,从此以后都没有
* 要注意的是:MySecondInterceptor不放行,但是他前面已经放行了的拦截器的afterCompletion总会执行的
*/
public class MyFirstInterceptor implements HandlerInterceptor{
/*
* 目标方法运行之前运行
* (non-Javadoc)
* @see org.springframework.web.servlet.HandlerInterceptor#preHandle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object)
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyFirstInterceptor preHandle运行了...");
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("MyFirstInterceptor postHandle运行了...");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
System.out.println("MyFirstInterceptor afterCompletion运行了...");
}
}
2. 配置拦截器:
<mvc:interceptors>
<!-- 配置某个拦截器,默认是拦截所有请求的 -->
<bean class="com.test.controller.MyFirstInterceptor"></bean>
</mvc:interceptors>
3.测试,输出拦截器方法执行顺序: