定义一个拦截类
package com.xiaoxin.demo.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 HandlerInterceptor1 implements HandlerInterceptor{
/**
* 该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。该方法将在整个请求完成之后,也就是DispatcherServlet渲染了视图执行,
* 这个方法的主要作用是用于清理资源的,当然这个方法也只能在当前这个Interceptor的preHandle方法的返回值为true时才会执行。
*/
//应用场景:统一异常处理,统一日志处理
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
System.out.println("afterCompletion");
}
/**
* 这个方法只会在当前这个Interceptor的preHandle方法返回值为true的时候才会执行。
* postHandle是进行处理器拦截用的,它的执行时间是在处理器进行处理之
* 后,也就是在Controller的方法调用之后执行,但是它会在DispatcherServlet
* 进行视图的渲染之前执行,也就是说在这个方法中你可以对ModelAndView进行操
* 作。这个方法的链式结构跟正常访问的方向是相反的,也就是说先声明的Interceptor
* 拦截器该方法反而会后调用
*/
//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,
//也可以在这里统一指定视图
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
System.out.println("postHandle");
}
/**
* preHandle方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用,SpringMVC中的Interceptor拦截器是链式的,可以同时存在
* 多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在
* Controller方法调用之前调用。SpringMVC的这种Interceptor链式结构也是可以进行中断的,这种中断方式是令preHandle的返
* 回值为false,当preHandle的返回值为false的时候整个请求就结束了。
*/
//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
// TODO Auto-generated method stub
System.out.println("preHandle");
return true;
}
}
将拦截类注册到springmvc中去
<mvc:interceptors>
<mvc:interceptor>
<!-- /**表示所有url包括子url路径 -->
<mvc:mapping path="/**"/>
<bean class="com.xiaoxin.demo.interceptor.HandlerInterceptor1"></bean>
</mvc:interceptor>
</mvc:interceptors>
访问http://localhost:8080/springmvctest/sendSpringmvc/view
后台输出打印:
preHandle
进来了
postHandle
afterCompletion
基本的使用就是这样在拦截器中我们可以完成一些拦截,例如我们可以解决乱码问题,比如我们可以解决登陆权限问题
拦截器链的执行顺序例如有拦截器A,拦截器B,它们的执行顺序是
A.preHandle如果为true执行B.preHandle为true执行控制器的业务逻辑在返回modelAndView之前执行B.postHandle在执行A.postHandle在执行B.afterCompletion在执行A.afterCompletion
拦截器类还可以实现WebRequestInterceptor