SpringMVC拦截器及多拦截器时的执行顺序

拦截器的配置步骤

  1. springmvc.xml中配置多个拦截器
  2. 配置自定义拦截器并实现接口



    
        
        
        
        
    

    
            
            
    

 

//拦截器1

public class Inteceptor1 implements HandlerInterceptor{

    //方法执行前1
     public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        //返回值boolean类型  决定是否放行
        System.out.println("方法执行前1");
        return true;
    }

    //方法执行后1
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception {
        System.out.println("方法执行后1");
    }

    //页面渲染后1
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {
        System.out.println("页面渲染后1");   
    }

}

 

//拦截器2
public class Inteceptor2 implements HandlerInterceptor{

    //方法执行前2
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        //返回值boolean类型  决定是否放行
        System.out.println("方法执行前2");
        return true;
    }

    //方法执行后2
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception {
        System.out.println("方法执行后2");
    }

    //页面渲染后2
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {
        System.out.println("页面渲染后2");   
    }

}

 

SpringMVC拦截器配置后,主要对三个过程进行拦截校验:

  1. 方法执行前(有boolean返回值,返回true则放行)【Hanler执行之前】
  2. 方法执行后【Handler执行之后,ModelAndView返回之前】
  3. 页面渲染后【ModelAndView执行之后,对异常处理】

 

多个拦截器执行顺序

    如有两个拦截器

    (1)方法执行前返回值都为true,则顺序如下

    方法执行前1   

    方法执行前2

    方法执行后2

    方法执行后1

    页面渲染后2

    页面渲染后1        

 

方法1和方法2是相对的,取决于springmvc自定义拦截器类配置的先后顺序(这里是自定义拦截器1先于拦截器2)

总结起来: 拦截器1中的方法执行前1先执行,后执行拦截器2中的方法执行前2方法,后拦截器2的方法先于拦截器1的方法执行

 

    (2)拦截器1中方法执行前1 返回值为false,而拦截器2中方法执行前2返回值为 true 执行顺序如下:

        方法执行前1    //此时被拦截,不放行

总结起来:只执行拦截器1方法执行前的方法,当拦截器1方法执行前被拦截,返回值为false不被放行,后面的拦截器链都不执行,无论2的返回值是true还是false

 

     (3)拦截器1中方法执行前1 返回值为true,而拦截器2中方法执行前2返回值为 false  执行顺序如下:

        方法执行前1

        方法执行前2   //被拦截,不放行

        页面渲染后1

 

总结执行顺序:

  • preHandle按拦截器定义顺序调用
  • postHandler按拦截器定义逆序调用
  • afterCompletion按拦截器定义逆序调用
  • postHandler在拦截器链内所有拦截器返成功调用
  • afterCompletion只有preHandle返回true才调用

 

 

如何让两个Interceptor有序执行呢?

如果继承WebMvcConfigurationSupport,需要处理所有SpringMVC为我们提供的接口实现,所以我们继承WebMvcConfigurerAdapter,我们想要Interceptor顺序执行,重写addInterceptor()方法

public void addInterceptors(InterceptorRegistry registry){
		 registry.addInterceptor(authInterceptor).excludePathPatterns("/static").addPathPatterns("/**");
		    registry
		        .addInterceptor(authActionInterceptor).addPathPatterns("/house/toAdd")
		        .addPathPatterns("/accounts/profile").addPathPatterns("/accounts/profileSubmit")
		        .addPathPatterns("/house/bookmarked").addPathPatterns("/house/del")
		        .addPathPatterns("/house/ownlist").addPathPatterns("/house/add")
		        .addPathPatterns("/house/toAdd").addPathPatterns("/agency/agentMsg")
		        .addPathPatterns("/comment/leaveComment").addPathPatterns("/comment/leaveBlogComment");
		    super.addInterceptors(registry);
	}

 

你可能感兴趣的:(SpringMVC拦截器及多拦截器时的执行顺序)