1. 自定义拦截器
创建一个FirstInterceptor.java
package com.springmvc.interceptors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class FirstInterceptor implements HandlerInterceptor{
/**
* 该方法在目标方法之前被调用.
* 若返回值为 true, 则继续调用后续的拦截器和目标方法.
* 若返回值为 false, 则不会再调用后续的拦截器和目标方法.
*
* 可以考虑做权限. 日志, 事务等.
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("[FirstInterceptor] preHandle");
return true;
}
/**
* 调用目标方法之后, 但渲染视图之前.
* 可以对请求域中的属性或视图做出修改.
*/
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("[FirstInterceptor] postHandle");
}
/**
* 渲染视图之后被调用. 释放资源
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("[FirstInterceptor] afterCompletion");
}
}
在SpringMVC配置文件中配置自定义拦截器
<mvc:interceptors>
<!-- 配置自定义的拦截器 -->
<bean class="com.springmvc.interceptors.FirstInterceptor"></bean>
</mvc:interceptors>
发起请求时,如发起emps请求,拦截器就起作用了,效果如下:
拦截器方法执行顺序
2. 拦截器的配置
这里要介绍一个SpringMVC配置文件的标签<mvc:interceptor></mvc:interceptor>
,这个标签是包含在<mvc:interceptors></mvc:interceptors>
里面的,其子标签可以定义此拦截器作用于哪些路径,不作用于哪些路径
创建一个SecondInterceptor.java
package com.springmvc.interceptors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class SecondInterceptor implements HandlerInterceptor{
/**
* 该方法在目标方法之前被调用.
* 若返回值为 true, 则继续调用后续的拦截器和目标方法.
* 若返回值为 false, 则不会再调用后续的拦截器和目标方法.
*
* 可以考虑做权限. 日志, 事务等.
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("[SecondInterceptor] preHandle");
return false;
}
/**
* 调用目标方法之后, 但渲染视图之前.
* 可以对请求域中的属性或视图做出修改.
*/
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("[SecondInterceptor] postHandle");
}
/**
* 渲染视图之后被调用. 释放资源
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("[SecondInterceptor] afterCompletion");
}
}
SpringMVC中配置
<mvc:interceptors>
<!-- 配置拦截器(不)作用的路径 -->
<mvc:interceptor>
<!-- 只作用于emps请求 -->
<mvc:mapping path="/emps"/>
<bean class="com.springmvc.interceptors.SecondInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
发起emps请求,可以看到两个拦截器都起作用了
发器其他请求,如下,SecondInterceptor拦截器没有起作用
3. 拦截器的执行顺序
从这个途中可以看出,当配置多个个拦截器起作用时,执行顺序有点乱
两个拦截器在SpringMVC的配置顺序如下:
<mvc:interceptors>
<!-- 配置自定义的拦截器 -->
<bean class="com.springmvc.interceptors.FirstInterceptor"></bean>
<!-- 配置拦截器(不)作用的路径 -->
<mvc:interceptor>
<mvc:mapping path="/emps"/>
<bean class="com.springmvc.interceptors.SecondInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
结论:
- 对于preHandle按配置的顺序执行
- 对于postHandle按配置的反顺序执行
- 对于afterCompletion按配置的反顺序执行
图释:
将SecondInterceptor的preHandle方法返回值改为false时,则不会再调用后续的拦截器和目标方法,上面方法有注释解释。
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("[SecondInterceptor] preHandle");
return false;//==================================================
}
结果:
图释: