一:自定义拦截器
- springMVC可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须要实现HandlerInterceptor接口
- preHandle():这个方法在业务处理器处理之前被调用,在该方法中对用户请求request进行处理,如果程序员决定该拦截器对请求进行处理拦截后还要调用其他拦截器,或者是业务处理器去进行处理,则返回true,如果程序员决定不需要再调用其他组件去处理请求,则返回false。
- postHandle():这个方法是在业务处理器处理完请求后,但是DispatherServlet向客户端返回响应前调用,在该方法中用用户请求request进行处理。
- afterCompletion():这个方法是在dispatcherServlet完全处理完请求后调用,可以在该方法中处理一些资源清理的操作。
二:自定义一个拦截器
1.创建类firstInterceptor 并实现handlerInterceptor接口
package com.dhx.firstinterceptor;
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{
/*
* 渲染视图之后被调用
* 释放资源
*/
@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");
}
/*
* 该方法在目标方法之前被调用
* 若返回值是true,则继续调用后续的拦截器和目标方法
* 若返回值是false,则不会调用后续的拦截器和目标方法
*
* 可以做日志,事务,权限等
*/
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("[FirstInterceptor]+preHandle");
return true;
}
}
2.在springMVC中配置拦截器
<mvc:interceptors>
<!-- 配置 LocaleChangeInterceptor-->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
<!--配置自定义拦截器 -->
<bean class="com.dhx.firstinterceptor.FirstInterceptor"></bean>
</mvc:interceptors>
三:拦截器的配置
<mvc:interceptors>
<!-- 配置 LocaleChangeInterceptor-->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
<!--配置自定义拦截器 -->
<bean class="com.dhx.firstinterceptor.FirstInterceptor"></bean>
<!--拦截指定资源 -->
<mvc:interceptor>
<mvc:mapping path="/emp"/>
<bean class="com.dhx.firstinterceptor.SeccondInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
四:多个拦截方法的执行顺序
1.preHandle方法根据拦截器配置的顺序正向执行,afterCompletion和postHandle方法根据拦截器的顺序反向执行
2.如果 SeccondInterceptor的preHandle方法返回false时,流程如下,当一个拦截器执行之后,必须要执行afterCompletion方法