拦截器和参数解析器的认识

1.关于顺序。

在Spring MVC中,addArgumentResolvers 方法和 addInterceptors 方法的执行顺序是有限制的。通常情况下,addArgumentResolvers 方法会先于 addInterceptors 方法执行。

具体来说,当Spring MVC初始化时,会首先执行 addArgumentResolvers 方法,将所有的自定义参数解析器添加到参数解析器列表中。接下来,会执行 addInterceptors 方法,将所有的拦截器添加到拦截器列表中。最后,当请求进来时,会先执行拦截器链,再执行参数解析器链。

这个顺序的限制是为了确保拦截器在参数解析之前执行,以便在拦截器中进行必要的验证、鉴权等操作,然后将处理器方法所需的参数信息传递给参数解析器进行解析。

在实际使用中,如果确实有拦截器依赖于参数解析器的解析结果,或是特定的执行顺序要求,你可以通过实现Ordered接口或在@Configuration类中使用@Order注解来指定执行顺序。

例如,你可以在 WebConfig 配置类上添加 @Order 注解,用于显式指定该配置类的执行顺序,数字越小优先级越高:

@Configuration
@EnableWebMvc
@Order(1) // 设置优先级,大于1的值表示较低优先级
public class WebConfig implements WebMvcConfigurer {
    // ...
}

通过显式指定优先级,可以确保 addArgumentResolvers 和 addInterceptors 方法按照期望的顺序执行。

需要注意的是,在同一个项目中,你可能会有多个配置类,它们分别实现了 WebMvcConfigurer 接口。如果多个配置类都定义了 addArgumentResolvers 和 addInterceptors 方法,那么它们之间的执行顺序将根据它们的优先级进行排序。

总结来说,通常情况下,addArgumentResolvers 方法会先于 addInterceptors 方法执行。但如果有特殊需求或者多个配置类同时存在时,可以通过实现 Ordered 接口或使用 @Order 注解来指定执行顺序。

2.我自己的认识就是:初始化时先参数解析器入栈,然后拦截器入栈,这样形成的栈才可以在后续操作的时候执行先拦截,后解析的操作。

  而且:因为进栈顺序有要求,所以如果拦截器不入栈只有参数解析器入栈的话,那我们只自定义注解就可以了!!并不一定两个都使用嗷!!

     最好是自定义注解如果与token相关的话就只自定义注解,不要在拦截token了,不然报错容易混乱!!

3.要注意在一个项目下面可以在不同的包下设置参数解析器,但是最好只有一个类去实现   WebMvcConfigurer   但是如果有多个只要添加的拦截器解析器名字不冲突就可。

/**
* 通用配置
*
* @author ruoyi
*/
@Configuration
public class ResourcesConfig implements WebMvcConfigurer
{
/**
* 添加参数解析器
*/
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new LoginUserHandlerMethodArgumentResolver()); // 将参数解析器注入到mvc容器里面,可以添加多个,只需要在运行argumentResolvers.add
}

/**
* 自定义拦截规则
*/
@Override
public void addInterceptors(InterceptorRegistry registry)
{
registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**");

// 新注册一个拦截器
registry.addInterceptor(tokenInterceptor)
// 拦截如下路径
.addPathPatterns("/xx/**")
// 放开以下路径
.excludePathPatterns("/xx/xx/xxx");
}
}

 

posted @ 2023-10-24 15:31  xiaobaibao  阅读(105)  评论(0编辑  收藏  举报