1. 自定义拦截器
SpringMVC的拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。用户可以自己定义一些拦截器来实现特定的功能。
在程序开发过程中,如果需要开发自己的拦截器类,就需要实现HandlerInterceptor接口:
public class HandlerInterceptorDemo1 implements HandlerInterceptor {
/**
* 如何调用:按拦截器定义顺序调用
* 何时调用:只要配置了都会调用
* 有什么用:如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回 true
* 如果程序员决定不需要再调用其他的组件去处理请求,则返回 false
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle拦截器拦截了");
return true;
}
/**
* 如何调用:按拦截器定义逆序调用
* 何时调用:在拦截器链内所有拦截器都返成功后调用
* 有什么用:在业务处理器处理完请求后,但是 DispatcherServlet向客户端返回响应前被调用
* 在该方法中可以对模型视图 ModelAndView进行处理。
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle方法执行了");
}
/**
* 如何调用:按拦截器定义逆序调用
* 何时调用:只有 preHandle返回 true才调用
* 有什么用:在 DispatcherServlet完全处理完请求后被调用
* 可以在该方法中进行一些资源清理的操作
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion方法执行了");
}
}
配置拦截器:
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 用于指定拦截的 url -->
<mvc:mapping path="/**"/>
<!-- 用于指定排除的 url -->
<mvc:exclude-mapping path=""/>
<bean id="handlerInterceptorDemo1" class="com.joker.web.interceptor.HandlerInterceptorDemo1"></bean>
</mvc:interceptor>
</mvc:interceptors>
测试运行结果:
2. 多个拦截器的执行顺序
拦截器1:
public class HandlerInterceptorDemo1 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器1:preHandle拦截器拦截了");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("拦截器1:postHandle拦截器拦截了");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("拦截器1:afterCompletion拦截器拦截了");
}
}
拦截器2:
public class HandlerInterceptorDemo2 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器2:preHandle拦截器拦截了");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("拦截器2:postHandle拦截器拦截了");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("拦截器2:afterCompletion拦截器拦截了");
}
}
配置拦截器:
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean id="handlerInterceptorDemo1" class="com.joker.web.interceptor.HandlerInterceptorDemo1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean id="handlerInterceptorDemo2" class="com.joker.web.interceptor.HandlerInterceptorDemo2"></bean>
</mvc:interceptor>
</mvc:interceptors>
测试运行结果:
以上是拦截器1和拦截器2的preHandle方法都放行的情况,假如我们将拦截器2的preHandle方法返回false,让其不放行,其测试运行结果如下: