一、拦截器
1、自定义拦截器
SpringMVC 也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现 HandlerInterceptor接口
继承 HandlerInterceptor 实现一个拦截器
- preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求 request 进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
- postHandle():这个方法在业务处理器处理完请求后,但是 DispatcherServlet 向客户段返回响应前被调用,在该方法中对用户请求的request进行处理。
- afterCompletion():这个方法在 DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
public class SecondInterceptor implements HandlerInterceptor {
/**
* 该方法在目标方法之前被调用,
* 若返回值为true,则继续调用后续的拦截器和目标方法
* 若返回值为false,则不会继续调用后续的拦截器和目标方法
*
* 可以考虑做权限、日志、事务
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return true;
}
/**
* 调用目标方法之后,渲染视图之前被调用
*
* 可以对请求域中的属性或视图做出修改
*
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
/**
* 渲染视图之后被调用
* 释放资源
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}
在配置文件中注册:
<mvc:interceptors>
<!--配置自定义拦截器-->
<bean class="com.smart.util.FirstInterceptor"/>
<!--配置LocalChangeInterceptor-->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
</mvc:interceptors>
其他配置:
<mvc:interceptors>
<!--配置自定义拦截器-->
<bean class="com.smart.util.FirstInterceptor"/>
<!--配置拦截器(不)作用于指定的路径-->
<mvc:interceptor>
<mvc:mapping path="/emps"/>
<bean class="com.smart.util.SecondInterceptor"/>
</mvc:interceptor>
<!--配置LocalChangeInterceptor-->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
</mvc:interceptors>
2、多个拦截方法的执行顺序
也就是说preHandle是顺序执行,postHandle和afterCompletion是倒序执行的。