SpringMvc自定义拦截器
Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口:
– preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求 request 进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
– postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet 向客户端返回响应前被调用,在该方法中对用户请求request进行处理。
– afterCompletion():这个方法在 DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
执行流程:
ex:
1.编写第一个拦截器:
public class FirstInterceptor implements HandlerInterceptor {
/**
* 该方法在目标方法之前被调用
* 如果返回为true,则继续调用后续的拦截器以及目标方法
* 如果返回值为false,则不会调用后续的拦截器和目标方法
* 可以考虑做权限,日志,事务等
* */
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("[FirstInterceptor] preHandle");
return true;
}
/*调用目标方法之后,但渲染视图之前
* 可以对请求域中的属性或者视图做出修改*/
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("[FirstInterceptor] postHandle");
}
/*渲染视图之后
* 释放资源*/
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("[FirstInterceptor] afterCompletion");
}
}
2.在配置文件中添加拦截器:
<mvc:interceptors>
<!--配置自定义的拦截器-->
<bean class="com.test.interceptor.FirstInterceptor"></bean>
<!--配置LocaleChangeInterceptor-->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
</mvc:interceptors>
默认是拦截全部的请求。
以上是单个拦截器的情况,如果是多个拦截器的话该怎么处理呢?
编写第二个拦截器:
ublic class SecondInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("[SecondInterceptor] preHandle");
return true;
}
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("[SecondInterceptor] postHandle");
}
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("[SecondInterceptor] afterCompletion");
}
}
配置它的拦截路径:
<mvc:interceptors>
<!--配置自定义的拦截器-->
<bean class="com.test.interceptor.FirstInterceptor"></bean>
<!--可以配置拦截器作用的路径-->
<mvc:interceptor>
<mvc:mapping path="/emps"/>
<bean class="com.test.interceptor.SecondInterceptor"/>
</mvc:interceptor>
<!--配置LocaleChangeInterceptor-->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
</mvc:interceptors>
情况1:
第一个拦截器的prehandle方法返回false:
页面并不会显示任何东西,只是会执行preHandle方法
情况2:
第二个拦截器prehandle返回为false,第一个返回true
/emps的请求都会被拦截执行的顺序如下:
[FirstInterceptor] preHandle
[SecondInterceptor] preHandle
[FirstInterceptor] afterCompletion
图解:
1.prehandle返回值都为true的情况:
2.第二个拦截器prehandle返回值为false的情况:
还没有评论,来说两句吧...