• 12_springmvc拦截器


    一.定义

    Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。

    二.拦截器定义

    实现HandlerInterceptor接口,如下:

    package com.ssm.interceptor;
    
    import org.omg.PortableInterceptor.Interceptor;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Description:测试拦截器1
     * User: jiatp
     * Date: 2019/9/11 0011 下午 4:10
    */
    public class HandlerInterceptor1 implements HandlerInterceptor  {
        /*
         *进入handler方法之前执行,用于身份验证,身份授权
         *如果身份认证没有通过则拦截住不让执行
         *true:放行,false:拦截
         */
        @Override
        public boolean preHandle(HttpServletRequest httpServletRequest,
                                 HttpServletResponse httpServletResponse, Object o) throws Exception {
    
            System.out.println("HandlerInterceptor1...preHandle");
            return true;
        }
        /*进入handler方法之后,返回modelandView之前执行
        *应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图(菜单导航)
        * */
        @Override
        public void postHandle(HttpServletRequest httpServletRequest,
                               HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
            System.out.println("HandlerInterceptor1...postHandle");
    
        }
        /*
        *handler执行完执行此方法,
        * 应用场景:统一异常处理,日志处理等方法
        * */
        @Override
        public void afterCompletion(HttpServletRequest httpServletRequest,
                                    HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
            System.out.println("HandlerInterceptor1...afterCompletion");
    
        }
    }
    

    三.拦截器的配置

    1.针对某种mapping配置拦截器

    <bean
    	class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
    	<property name="interceptors">
    		<list>
    			<ref bean="handlerInterceptor1"/>
    			<ref bean="handlerInterceptor2"/>
    		</list>
    	</property>
    </bean>
    	<bean id="handlerInterceptor1" class="springmvc.intercapter.HandlerInterceptor1"/>
    	<bean id="handlerInterceptor2" class="springmvc.intercapter.HandlerInterceptor2"/>
    

    2.针对所有mapping配置全局拦截器

    
    <!--拦截器 -->
    <mvc:interceptors>
    	<!--多个拦截器,顺序执行 -->
    	<mvc:interceptor>
    		<mvc:mapping path="/**"/>
    		<bean class="cn.itcast.springmvc.filter.HandlerInterceptor1"></bean>
    	</mvc:interceptor>
    	<mvc:interceptor>
    		<mvc:mapping path="/**"/>
    		<bean class="cn.itcast.springmvc.filter.HandlerInterceptor2"></bean>
    	</mvc:interceptor>
    </mvc:interceptors>
    

    四.测试

    定义两个拦截器分别为:HandlerInterceptor1和HandlerInteptor2,每个拦截器的preHandler方法都返回true。

    true:放行,false:拦截

    执行测试:

    HandlerInterceptor1..preHandle..

    HandlerInterceptor2..preHandle..

     

    HandlerInterceptor2..postHandle..

    HandlerInterceptor1..postHandle..

     

    HandlerInterceptor2..afterCompletion..

    HandlerInterceptor1..afterCompletion..

    五.中断流程测试

    定义两个拦截器分别为:HandlerInterceptor1和HandlerInteptor2

    运行流程

    HandlerInterceptor1的preHandler方法返回false,HandlerInterceptor2返回true,运行流程如下:

    HandlerInterceptor1..preHandle..

    从日志看出第一个拦截器的preHandler方法返回false后第一个拦截器只执行了preHandler方法,其它两个方法没有执行,第二个拦截器的所有方法不执行,且controller也不执行了。

    HandlerInterceptor1的preHandler方法返回true,HandlerInterceptor2返回false,运行流程如下:

    HandlerInterceptor1..preHandle..

    HandlerInterceptor2..preHandle..

    HandlerInterceptor1..afterCompletion..

    从日志看出第二个拦截器的preHandler方法返回false后第一个拦截器的postHandler没有执行,第二个拦截器的postHandlerafterCompletion没有执行,且controller也不执行了。

    总结:

    preHandle按拦截器定义顺序调用

    postHandler按拦截器定义逆序调用

    afterCompletion按拦截器定义逆序调用

    postHandler在拦截器链内所有拦截器返成功调用

    afterCompletion只有preHandle返回true才调用

    持续补充中...

  • 相关阅读:
    ibatis resultMap 结果集映射
    iabtis初探
    struts2获取请求参数的三种方式及传递给JSP参数的方式
    Struts2的运行机制简介
    Spring AOP面向切面编程的实现
    java 单例模式及getInstance的好处
    It is indirectly referenced from required .class files
    AngularJS学习篇(二)
    AngularJS学习篇(一)
    Flex布局语法
  • 原文地址:https://www.cnblogs.com/jatpeo/p/11767513.html
Copyright © 2020-2023  润新知