SpringMVC拦截器

 1.拦截器简介

  • 拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行

  • 作用:

    • 在指定的方法调用前后执行预先设定的代码

    • 阻止原始方法的执行

    • 总结:拦截器就是用来做增强

看完以后,大家会发现

  • 拦截器和过滤器在作用和执行顺序上也很相似

所以这个时候,就有一个问题需要思考:拦截器和过滤器之间的区别是什么?

SpringMVC拦截器_第1张图片

由上图,对Filter和Interceptor做个对比:

Filter技术 Interceptor技术
技术范畴 JavaWeb原生技术 SpringMVC框架技术
拦截/过滤资源 可以对所有请求都过滤,包括任何Servlet,JSP,其他资源等 只对进入了SpringMVC管辖范围的才拦截,主要拦截Controller请求
执行时机 早于任何Servlet执行 晚于DispactherServlet执行

2.拦截器Intercept介绍

 实现了HandlerInterceptor接口,且被Spring管理的Bean都是拦截器,接口定义如下:

public interface HandlerInterceptor {
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }

    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

HandlerInterceptor接口方法的作用及其参数,返回值详解如下:

作用 参数 返回值
preHandle 对拦截到的请求进行预处理,返回true放行处理器方法,false不放行 Hanlder是拦截到的Controller方法处理器 一旦返回false,代表终止向后执行,所有后置方法都不执行,之中方法只执行对应preHandler返回了true的
postHandle 在处理器的方法执行后,对拦截到的请求进行后处理,可以在方法中对模型数据和视图进行修改 Handler是拦截到的Controller方法处理器;modelAndView是返回的模型视图对象
afterCompletion 视图渲染完成后(整个流程结束之后)进行最后的处理,如果请求流程中有异常,可以处理异常对象 Handler是拦截到的Controller方法处理器;ex是异常对象

3.拦截器快速入门 

1.编写MyInterceptor实现HandlerInterceptor接口:

package com.rocky.Interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor is running ");
        return true;  //是否放行 true 代表放行   false 代表不放行
    }

    @Override
    public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor is postHandle ");
    }

    @Override
    public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor is afterCompletion ");
    }
}

2.在配置文件中配置Interceptor


    
        
            
            
            
        
    

4.拦截器执行顺序

拦截器三个方法的执行顺序

1.当每个拦截器都是放行状态时,三个方法的执行顺序如下:

SpringMVC拦截器_第2张图片

2.当Interceptor1和Interceptor2处于放行,Interceptor3处于不放行时,三个方法的执行顺序如下:

SpringMVC拦截器_第3张图片

3.拦截器执行顺序取决于 interceptor 的配置顺序 


    
        
            
            
        
        
            
            
        
       
    

你可能感兴趣的:(java,后端,mvc)