自定义拦截器
Spring MVC可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义拦截器必须实现HandlerInterceptor接口。
方法 | 方法简介 |
---|---|
preHandle() | 这个方法在业务处理器请求之前被调用,在该方法中对用户请求request进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其它的拦截器,或者是业务处理器去处理,则返回true;如果程序员决定不需要再调用其它的组件去处理请求,则返回false。 |
postHandle() | 这个方法在业务处理器处理完请求后,但是DispatcherServlet向客户端返回响应前被调用,在该方法中对用户请求request进行处理。 |
afterCompletion() | 这个方法在DispatcherServlet完全处理完请求后被调用,可以在该方法中进行一些资源清理操作。 |
第一个Spring MVC拦截器程序
配置自定义的拦截器:
<mvc:interceptors>
<bean class="com.example.springmvc.interceptors.FirstInterceptor"></bean>
</mvc:interceptors>
编写程序:
public class FirstInterceptor implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("FirstInterceptor afterCompletion");
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
System.out.println("FirstInterceptor postHandle");
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2) throws Exception {
System.out.println("FirstInterceptor preHandle");
return true;
}
}
运行结果:
拦截方法的执行顺序:
preHandle在目标方法调用前被调用。若返回这为true,则继续调用后续的拦截器和目标方法。若返回值为false,则不会在调用后续的拦截器和目标方法。可以考虑做权限或者日志、事务。
postHandle是在调用目标方法之后,渲染视图之前被调用的。可以对请求域中的属性或视图做出修改。
afterCompletion是在渲染视图之后被调用的。可以用来释放资源。
Spring MVC拦截器的配置
在<mvc:interceptors></mvc:interceptors>中配置如下代码:
<mvc:interceptor>
<mvc:mapping path="/emps"/>
<bean class="com.example.springmvc.interceptors.SecondInterceptor"/>
</mvc:interceptor>
这样配置之后,拦截器SecondInterceptor只会作用于路径/emps而不作用于其它的方法或路径。
多个拦截器的执行顺序
preHandle会按照拦截器定义的先后顺序执行。
postHandle和afterCompletion按照拦截器定义的相反的顺序执行。
这里需要注意一个点。如果我们把SecondInterceptor中的preHandle返回值设为false。那么执行的顺序会有所改变。如下图所示:
由于SecondInterceptor的preHandle返回值为false。内部的循环将不会进行下去。也就不会执行之后的方法。当然也不会释放SecondInterceptor的资源了。
网友评论