springMVC入门(八)------拦截器

简介

springMVC拦截器针对处理器映射器进行拦截配置
如果在某个处理器映射器中配置拦截,经过该处理器映射器映射成功的Handler最终使用该拦截器
由于springMVC支持配置多个处理器映射器,因此针对拦截器的配置也有两种,一种针对某一处理器映射器进行配置,一种针对所有处理器映射器进行配置
而实践中往往使用后者,因此接下来的测试代码也以后者为主

拦截器配置

Controller层

    @RequestMapping("/queryUser")
    public String queryUser(User user) {
        System.out.println("Handler");
        return "/WEB-INF/jsp/user.jsp";
    }
自定义拦截器需实现HandlerInterceptor接口
public class FirstHandlerInterception implements HandlerInterceptor {
 
    /**
     * 执行期:进入Handler方法之前执行
     * 应用:用于身份认证、身份授权
     */
    @Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        System.out.println("preHandle");
        //false代表拦截,不向下执行
        //true代表通过
        return false;
    }
 
    /**
     * 执行期:进入Handler方法之后,返回ModelAndView之前
     * 应用:用于向ModelAndView中填充公共数据、指定统一的视图
     */
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception {
         System.out.println("postHandle");
    }
 
    /**
     * 执行期:进入Handler完成
     * 应用:用于统一异常处理、统一日志处理
     */
    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception {
         System.out.println("postHandle");
    }
}

springMVC配置文件中配置拦截器

    <!-- 配置拦截器 -->
    <mvc:interceptors>
        <!-- 多个拦截器顺序执行 -->
        <mvc:interceptor>
            <!-- 拦截所有URL -->
            <mvc:mapping path="/**"/>
            <bean class="com.springmvc.intercepter.FirstHandlerInterception"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

访问URL:http://localhost:8080/springMVC/queryUser.action
执行结果,Console输出:

多拦截器测试

配置拦截器2,方式与上文所诉一致,不再赘述
访问URL:http://localhost:8080/springMVC/queryUser.action

场景1:拦截器1通过,拦截器2通过
场景2:拦截器1不通过,拦截器2不通过
场景3:拦截器1不通过,拦截器2通过
场景4:拦截器1通过,拦截器2不通过

总结:
1、所有拦截器均通过,则首先顺序执行preHandler,再执行Handler,再逆序执行postHandler,再逆序执行afterCompletion
2、只要有一个拦截器不通过,则所有postHandler不执行
3、假设有n个拦截器,若第k的拦截器不通过,则先顺序执行preHandler到第k个拦截器(包括k的preHandler),然后逆序执行afterCompletion到第(k-1)个拦截器(不包括k的afterCompletion)

posted @ 2018-08-30 14:30  nlskyfree  阅读(268)  评论(0编辑  收藏  举报