Spring 拦截器 interceptor

Spring MVC

一、两种方式来定义:

1.通过实现HandlerInterceptor接口,或继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义。

2.通过实现WebRequestInterceptor接口,或继承WebRequestInterceptor接口的实现类来定义。

二、xml配置

<!-- 配置拦截器 --> //自定义 MyInterceptor要实现拦截器的接口
<bean id="customInterceptor" class="com.example.MyInterceptor" />
<!-- 配置拦截器映射 -->
<mvc:interceptors>
        <mvc:interceptor>
        <!-- 配置需要拦截的路径 -->
        <mvc:mapping path="/**" />
        <!-- 配置不需要拦截的路径 -->
        <mvc:exclude-mapping path="/login" />
        <mvc:exclude-mapping path="/error" />
        <!-- 引用拦截器bean -->
        <bean ref="customInterceptor" />
    </mvc:interceptor>

    <mvc:interceptor>
        ........
    </mvc:interceptor>
</mvc:interceptors>

三、处理过程

1.程序先执行preHandle()方法,如果该方法的返回值为true,则程序会继续向下执行处理器中的方法,否则将不再向下执行。

2.在业务处理器(即控制器Controller类)处理完请求后,会执行postHandle()方法,然后会通过DispatcherServlet向客户端返回响应。

3.在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。

四、多拦截器处理过程

preHandle1 -> preHande2 -> 【Controller】 -> postHandle2 -> postHandle1 -> afterCompletion2 -> afterComplention1

五、支持

拦截器是spring容器的,是spring支持的

六、java实现拦截

步骤一:自定义MyInterceptor类实现HandlerInterceptor接口

@Component
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("MyInterceptor:Pre Handle method is Calling");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response,
            Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor:Post Handle method is Calling");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception exception) throws Exception {
        System.out.println("MyInterceptor:Request and Response is completed");
    }
}

步骤二:注册拦截器(和XML方式的区别)

自定义MyInterceptorConfig类实现WebMvcConfigurer接口(springboot2.0以下版本使用WebMvcConfigurerAdapter)

@Component
public class MyInterceptorConfig implements WebMvcConfigurer {

    @Autowired
    MyInterceptor myInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {  

        // 可以写多个 registry.addInterceptor,也可写多个addPathPatterns
        registry.addInterceptor(myInterceptor).addPathPatterns("/a/ab")
        .addPathPatterns("/a/cd");
        // .addPathPatterns("/**") // 拦截所有请求
        .excludePathPatterns("/login", "/error"); // 排除登录和错误处理请求

    } 
}

 


 

HandlerInterceptor和WebRequestInterceptor的关系和区别
关系
功能相似性:两者都可用于在Controller层请求处理前后进行拦截,执行一些特定的逻辑。例如,两者都提供了preHandle、postHandle和afterCompletion方法,这些方法在请求处理的不同阶段被调用。
间接联系:WebRequestInterceptor间接实现了HandlerInterceptor的功能,这通过WebRequestHandlerInterceptorAdapter适配器类来实现。这意味着,WebRequestInterceptor可以被适配为HandlerInterceptor的形式,在Spring MVC框架中使用。
区别
1.参数类型:
HandlerInterceptor:其方法参数使用原生的HttpServletRequest和HttpServletResponse对象。
WebRequestInterceptor:其方法参数使用WebRequest对象,该对象是对HttpServletRequest和HttpServletResponse的包装,使得获取请求中的信息更为简便。
2.返回值:
HandlerInterceptor的preHandle方法返回一个布尔值,用于决定是否继续执行后续的Interceptor和Controller。如果返回false,则后续的Interceptor和Controller都不会被执行。
WebRequestInterceptor的preHandle方法没有返回值,意味着该方法中的逻辑不影响后续方法的执行。这表示WebRequestInterceptor主要是为了获取请求中的信息或预设一些参数供后续流程使用。
3.功能侧重:
HandlerInterceptor:功能更为强大和基础,可以在请求处理前、后以及视图渲染后执行各种逻辑,如权限验证、日志记录、异常处理等。
WebRequestInterceptor:主要侧重于请求验证的目的,它接收请求并对其进行处理,但不会像HandlerInterceptor那样强制拦截不合法的请求。
4.使用场景:
HandlerInterceptor:更适用于需要严格控制请求流程、执行复杂逻辑的场景,如权限验证、请求参数校验等。
WebRequestInterceptor:适用于需要简化请求信息处理、提取公共请求参数等场景。

 

posted @ 2022-03-09 09:02  #庄生晓梦  阅读(165)  评论(0编辑  收藏  举报