WxMpMapConfigImpl config = new WxMpMapConfigImpl(); config.setAppId(wxConfig.getMqAppId()); config.setSecret(wxConfig.getMqAppSecret()); config.useStableAccessToken(true); globalWxMpService.addConfigStorage(config.getAppId(),config); ### 模块版本情况 * WxJava 模块名: wx-java-map * WxJava 版本号: 4.6.0 (4.7.0 中的代码也是一样) ### 详细描述 背景:单机多租户模式,一个服务提供多个微信公众号相关的服务,根据租户标识区分。 上面的代码是在初始化的时候,确保 WxMpServiceImpl 中没有保存该租户WxMpMapConfig的时候,存入 WxMpConfigStorage。 问题:假设目前有2个租户,初始化了WxMpConfigStorage并存入。问题提在于 WxMpMapConfigImpl 中的 CONCURRENT_HASH_MAP 是静态属性,每次根据不同租户获取 WxMpConfigStorage 的时候确实能获取到不同的 WxMpMapConfigImpl 对象,但是获取到token的时候会出现静态属性覆盖的情况。 因为key是一样的,设置token以及获取token 都是固定的 "access_token",没有通过 CONCURRENT_HASH_MAP.get(this.getAppId()); 来做租户区分。 @Data public class WxMpMapConfigImpl extends WxMpDefaultConfigImpl { private static final ConcurrentHashMap<String, String> CONCURRENT_HASH_MAP = new ConcurrentHashMap<>(1); private static final String MAP_KEY = "access_token"; @Override public String getAccessToken() { return CONCURRENT_HASH_MAP.get(MAP_KEY); } } ### 修改建议 1. CONCURRENT_HASH_MAP 取消静态,改成非静态。 2. CONCURRENT_HASH_MAP.get(this.getAppId()); 来做租户区分
Activity
binarywang commentedon Mar 23, 2025
@braydenwong 麻烦看下
binarywang commentedon Mar 23, 2025
欢迎提供改造代码,提交PR即可
🐛 binarywang#3522 【公众号】WxMpMapConfigImpl 静态属性存储token导致多个 WxMpMapConfi…
🐛 #3522 【公众号】修复WxMpMapConfigImpl静态属性存储token导致多个实例时出现token没有隔离的情况