SpringMVC(十六)_使用拦截器

zhongjcbill 2017-08-20

       前言:本篇主要介绍SpringMVC的拦截器机制

 1. 自定义拦截器

       Spring MVC可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口。

public interface HandlerInterceptor {

    /**
     * 这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求 request 进行处理。
     * 如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去
     * 进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
     */
    default boolean preHandle(HttpServletRequest request, 
                              HttpServletResponse response, 
                              Object handler) throws Exception {
        return true;
    }
    
    /**
     * 这个方法在业务处理器处理完请求后,但是DispatcherServlet 向客户端返回响应前被调用
     * 在该方法中对用户请求request进行处理。
     */
    default void postHandle(HttpServletRequest request, 
                            HttpServletResponse response, 
                            Object handler, 
                            @Nullable ModelAndView modelAndView) throws Exception {
    }
    
    /**
     * 这个方法在 DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
     */
    default void afterCompletion( HttpServletRequest request, 
                                  HttpServletResponse response, 
                                  Object handler, 
                                  @Nullable Exception ex) throws Exception {
    }

}

2. 拦截器方法执行顺序

SpringMVC(十六)_使用拦截器
3. 配置拦截器

<mvc:interceptors>
    <!-- 配置自定义的拦截器. -->
    <bean class="com.wj.web.interceptors.FirstInterceptor"></bean>
    <!-- 配置拦截器的路径 -->
    <mvc:interceptor>
        <mvc:mapping path="/views/*"/>
        <!-- 配置拦截器(不)作用的路径 -->
        <mvc:exclude-mapping path="/views/getMap.action"/>
        <bean class="com.wj.web.interceptors.SecondInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

      此拦截器的执行顺序为:

SpringMVC(十六)_使用拦截器
    若第二个拦截器preHandle方法校验不通过,返回false,则拦截器的执行顺序为:

SpringMVC(十六)_使用拦截器
 

4. 拦截器实现

       FirstInterceptor:

public class FirstInterceptor implements HandlerInterceptor{

    /**
     * 该方法在目标方法之前被调用.
     * 若返回值为 true, 则继续调用后续的拦截器和目标方法. 
     * 若返回值为 false, 则不会再调用后续的拦截器和目标方法. 
     * 
     * 可以考虑做权限. 日志, 事务等. 
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        System.out.println("【FirstInterceptor】 preHandle");
        return true;
    }

    /**
     * 调用目标方法之后, 但渲染视图之前. 
     * 可以对请求域中的属性或视图做出修改. 
     */
    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("【FirstInterceptor】 postHandle");
    }

    /**
     * 渲染视图之后被调用. 释放资源
     */
    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("【FirstInterceptor】 afterCompletion");
    }

}

      SecondInterceptor:

public class SecondInterceptor implements HandlerInterceptor{

    /**
     * 该方法在目标方法之前被调用.
     * 若返回值为 true, 则继续调用后续的拦截器和目标方法. 
     * 若返回值为 false, 则不会再调用后续的拦截器和目标方法. 
     * 
     * 可以考虑做权限. 日志, 事务等. 
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        System.out.println("【SecondInterceptor】 preHandle");
        return true;
    }

    /**
     * 调用目标方法之后, 但渲染视图之前. 
     * 可以对请求域中的属性或视图做出修改. 
     */
    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("【SecondInterceptor】 postHandle");
    }

    /**
     * 渲染视图之后被调用. 释放资源
     */
    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("【SecondInterceptor】 afterCompletion");
    }

}

相关推荐