拦截器和参数解析器的认识
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");
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~