2026/4/18 12:25:55
网站建设
项目流程
成都网站建设工作,扬州网站建设推广专家,营销型网站建设 合肥,卖鞋的网站建设思路你提供的这段代码是 RuoYi 框架中核心的 PermitAllUrlProperties 配置类#xff0c;其核心作用是自动扫描项目中所有标注了 Anonymous 注解的 Controller 类/方法#xff0c;提取对应的 URL 路径并统一管理#xff0c;最终为 Sa-Token 等权限拦截器提供“允许匿名访问”的 U…你提供的这段代码是 RuoYi 框架中核心的PermitAllUrlProperties配置类其核心作用是自动扫描项目中所有标注了Anonymous注解的 Controller 类/方法提取对应的 URL 路径并统一管理最终为 Sa-Token 等权限拦截器提供“允许匿名访问”的 URL 列表。一、代码整体功能总结这个类实现了InitializingBean和ApplicationContextAware接口核心逻辑是在 Spring 容器初始化完成后扫描所有RequestMapping注解的 Controller 方法识别标注了Anonymous注解的类/方法提取其 URL 路径将 URL 中的路径变量如{id}替换为通配符*最终汇总成一个“匿名访问 URL 列表”对外提供getUrls()方法供 Sa-Token 拦截器等组件获取这些免登录的 URL。二、代码逐模块详细解释1. 类注解与核心成员Configuration// 声明为Spring配置类纳入容器管理publicclassPermitAllUrlPropertiesimplementsInitializingBean,ApplicationContextAware{// 正则表达式匹配URL中的路径变量如 {id}、{userId}privatestaticfinalPatternPATTERNPattern.compile(\\{(.*?)\\});// Spring应用上下文用于获取容器中的BeanprivateApplicationContextapplicationContext;// 存储所有允许匿名访问的URL列表privateListStringurlsnewArrayList();// 通配符常量用于替换路径变量publicStringASTERISK*;}InitializingBean实现该接口的afterPropertiesSet()方法会在 Spring 容器初始化完当前 Bean 的属性后执行ApplicationContextAware实现该接口的setApplicationContext()方法可获取 Spring 应用上下文用于获取RequestMappingHandlerMappingPATTERN正则匹配{xxx}格式的路径变量比如将/system/user/{id}中的{id}匹配出来。2. 核心方法setApplicationContext获取Spring上下文OverridepublicvoidsetApplicationContext(ApplicationContextcontext)throwsBeansException{this.applicationContextcontext;}作用Spring 容器初始化时自动将应用上下文注入到当前类的applicationContext成员变量中后续可通过该上下文获取RequestMappingHandlerMappingSpringMVC 中管理所有请求映射的核心 Bean。3. 核心方法afterPropertiesSet扫描并提取匿名URL这是整个类的核心逻辑Spring 容器初始化完成后自动执行OverridepublicvoidafterPropertiesSet(){// 1. 获取SpringMVC中管理所有RequestMapping映射的核心BeanRequestMappingHandlerMappingmappingapplicationContext.getBean(RequestMappingHandlerMapping.class);// 2. 获取所有请求映射keyRequestMappingInfoURL、请求方式等valueHandlerMethod对应Controller方法MapRequestMappingInfo,HandlerMethodmapmapping.getHandlerMethods();// 3. 遍历所有请求映射map.keySet().forEach(info-{HandlerMethodhandlerMethodmap.get(info);// 4. 第一步扫描方法上的Anonymous注解AnonymousmethodAnnotationUtils.findAnnotation(handlerMethod.getMethod(),Anonymous.class);// 如果方法上有Anonymous注解提取URL并处理Optional.ofNullable(method).ifPresent(anonymous-Objects.requireNonNull(info.getPatternsCondition().getPatterns()).forEach(url-{// 替换URL中的路径变量如{id}为*加入列表urls.add(RegExUtils.replaceAll(url,PATTERN,ASTERISK));}));// 5. 第二步扫描类上的Anonymous注解Controller类AnonymouscontrollerAnnotationUtils.findAnnotation(handlerMethod.getBeanType(),Anonymous.class);// 如果类上有Anonymous注解提取URL并处理Optional.ofNullable(controller).ifPresent(anonymous-Objects.requireNonNull(info.getPatternsCondition().getPatterns()).forEach(url-{urls.add(RegExUtils.replaceAll(url,PATTERN,ASTERISK));}));});}关键逻辑拆解步骤1-2获取RequestMappingHandlerMapping并拿到所有RequestMapping映射关系这是 SpringMVC 内部存储所有接口 URL 的核心数据结构步骤4检查 Controller 方法上是否有Anonymous注解比如GetMapping(/user/{id})Anonymous的方法会被识别info.getPatternsCondition().getPatterns()获取该方法对应的所有 URL 路径如[/user/{id}]RegExUtils.replaceAll(url, PATTERN, ASTERISK)将{id}替换为*最终 URL 变为/user/*步骤5检查 Controller 类上是否有Anonymous注解优先级低于方法注解比如RestController Anonymous RequestMapping(/system/dept)的类其下所有方法的 URL 都会被加入匿名列表Optional.ofNullable(…)避免空指针仅当注解存在时才执行后续逻辑。4. Getter/Setter 方法publicListStringgetUrls(){returnurls;}publicvoidsetUrls(ListStringurls){this.urlsurls;}作用对外提供获取“匿名URL列表”的入口你之前的SaTokenConfig中AllUrlHandler大概率会调用这个getUrls()方法获取所有允许匿名访问的 URL。三、使用场景与示例1. Anonymous 注解的使用示例// 示例1Controller类上标注Anonymous该类下所有方法都允许匿名访问AnonymousRestControllerRequestMapping(/system/login)publicclassLoginController{PostMapping(/doLogin)publicAjaxResultdoLogin(){/* 登录逻辑 */}}// 示例2单个方法上标注Anonymous仅该方法允许匿名访问RestControllerRequestMapping(/system/user)publicclassUserController{AnonymousGetMapping(/{id})publicAjaxResultgetUserById(PathVariableLongid){/* 查询用户逻辑 */}}2. URL 处理结果示例原始URL处理后URL加入urls列表说明/system/login/doLogin/system/login/doLogin无路径变量直接保留/system/user/{id}/system/user/*路径变量{id}替换为*/order/{orderId}/detail/{itemId}/order/*/detail/*多个路径变量全部替换四、与 SaTokenConfig 的关联你之前的SaTokenConfig中用到了AllUrlHandler.getUrls()而AllUrlHandler底层大概率会整合PermitAllUrlProperties.getUrls()Anonymous注解的URLSecurityProperties.getExcludes()配置文件中手动排除的URL最终为 Sa-Token 拦截器提供完整的“免登录URL列表”确保这些URL不会被StpUtil.checkLogin()拦截。五、核心设计亮点自动扫描无需手动配置匿名URL只需在类/方法上标注Anonymous自动识别并加入列表路径变量兼容将{id}替换为*避免因路径变量导致的URL匹配失败如/user/123能匹配/user/*Spring 生命周期整合利用InitializingBean和ApplicationContextAware在容器初始化阶段完成扫描保证数据提前加载。总结PermitAllUrlProperties是 RuoYi 框架中自动收集Anonymous注解URL的核心配置类通过扫描 SpringMVC 的请求映射提取并处理匿名访问的URL核心逻辑是将URL中的路径变量{xxx}替换为通配符*确保权限拦截器能正确匹配该类的getUrls()方法为 Sa-Token 拦截器提供“匿名URL列表”是框架免登录URL管理的关键组件。