Spring MVC 也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现 HandlerInterceptor 接口
– preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求 request 进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回 true;如果程序员决定不需要再调用其他的组件去处理请求,则返回 false。
– postHandle():这个方法在业务处理器处理完请求后,但是 DispatcherServlet 向客户端返回响应前被调用,在该方法中对用户请求 request 进行处理。
– afterCompletion():这个方法在 DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
测试代码:
首先新建一个拦截器 FirstInterceptor
package com.SpringMVC.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class FirstInterceptor implements HandlerInterceptor {
/*
* 该方法在目标方法前被调用. 若返回值为true,则继续调用后续的拦截器和目标方法. 若返回值为false,则不会再调用后续的拦截器和目标方法.
* 可以考虑做权限,日志,事务等.
*/
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("Interceptor:preHandle");
return true;
}
/*
* 调用目标方法之前,但喧染视图之后. 可以对请求域中的属性或视图做出修改.
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("Interceptor:postHandle");
}
/*
* 喧染视图之后被调用
*/
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("Interceptor:afterCompletion");
}
}
然后在 SpirngMVC 中配置拦截器
<mvc:interceptors>
<bean class="com.SpringMVC.interceptor.FirstInterceptor"></bean>
</mvc:interceptors>
拦截器方法的执行顺序:
首先调用 preHandle-> 执行一个方法-> 然后调用 postHandle-> 喧染视图-> 然后调用 afterCompletion.
用图表示如下:
配置自定义的拦截器:可以在 <mvc:interceptors></mvc:interceptors>
中加一个 <mvc:interceptor></mvc:interceptor>
里面会有一个 <mvc:mapping path=""/>
可以自定义路径
eg:
<mvc:interceptors>
<bean class="com.SpringMVC.interceptor.FirstInterceptor"></bean>
<mvc:interceptor>
<mvc:mapping path="/emps"/>
<bean class="com.SpringMVC.interceptor.SecondInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
如上图配置了两个拦截器后,执行顺序为:
当第二个拦截器 SecondInterceptor 中 preHandle 方法汇总 return 的值为 false 的时候 执行顺序为:
实线为被执行的顺序,虚线为不执行
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于