五、spring拦截器

五、spring拦截器

springmvc自定义拦截器需要实现HandlerInterceptor接口

        1)preHandle : 在进入控制器方法之前进行拦截处理
                boolean类型的返回值
                    true:放行 (进入下一个拦截器或者进入控制器方法)
                    false:拦截

        2)postHandle : 处理了控制器方法之后,执行
                      对响应结果进行处理                 

        3)afterCompletion : 所有流程全部正确执行完成
                1.preHandler
                2.控制器方法
                3.postHandler
                4.springMVC默认servlet(dispatcherServlet)
                在去执行此方法

1.简单的登录拦截器

public class interceptor implements HandlerInterceptor {
    // 拦截请求

    /**
     *   *login         - 登录
     *   *findAllUser   - 查询全部用户
     * 
     * 登录检查
     *      1.获取session
     *      2.从session中获取数据
     *      3.如果session数据为null,拦截
     *          * 请求转发到登录页面
     *      4.如果已经登录
     *          * 放行:进入到控制器方法中
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
        HttpSession session = request.getSession();
        Object user = session.getAttribute("user");
        System.out.println("1拦截器执行");
        if (user==null) {
            response.sendRedirect("login.jsp");
            return false;
        }else {
            return true;
        }
    }

    // 响应
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("1响应执行");
    }

    // 响应结束
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)

            throws Exception {
        System.out.println("1请求结束了");
    }

}

2.多拦截器执行顺序

  • preHandle:顺序执行
  • postHandle:逆序执行
  • afterCompletion:逆序执行

    拦截器的配置

<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**" />
            <mvc:exclude-mapping path="/login.jsp" />
            <mvc:exclude-mapping path="/login" />
            <bean class="cn.it.demo.interceptor.interceptor"></bean>
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/**" />
            <mvc:exclude-mapping path="/login.jsp" />
            <mvc:exclude-mapping path="/login" />
            <bean class="cn.it.demo.interceptor.interceptor2"></bean>
        </mvc:interceptor>
</mvc:interceptors>

拦截器2

public class interceptor2 implements HandlerInterceptor {


    /**
     * 
     */
    // 拦截请求
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
        HttpSession session = request.getSession();
        Object user = session.getAttribute("user");
        System.out.println("2拦截器执行");
            return true;
            /**
             * 第一个拦截器拦截后执行结果
             * return false; 
             * 1拦截器执行  说明当拦截器拦截了响应后,只执行拦截,不会执行拦截器最终方法
             */
            /**
             * 第二个拦截器拦截后执行结果
             * return false; 
             * 1拦截器执行  
             * 2拦截器执行
             * 1请求结束了
             * 说明当拦截器放行后,只要响应完成必然执行最终方法,
             *     但是响应方法执行取决于请求是否成功到达控制器方法
             */
            /**
             * 都放行执行结果
             * return false; 
             * 1拦截器执行
             * 2拦截器执行
             * 1请求结束了
             * 1拦截器执行
             * 2拦截器执行
             * 1请求结束了
             * 说明:多个拦截器执行的顺序为pre方法顺序执行,post、after方法逆序执行,
             *       只要该拦截器放行,响应结束后after方法就会执行,
             *        只有控制器方法执行,该拦截器post方法才会执行
             *         只要匹配到拦截器必然执行pre方法
             *    
             */

    }

    // 响应
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("2响应执行");
    }

    // 响应结束
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)

            throws Exception {
        System.out.println("2请求结束了");
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值