多微信号情况下的accessToken

发布于 2021-11-24 08:44:54 字数 2515 浏览 842 评论 1

@JFinal 你好,想跟你请教个问题:

我把AccessTokenApi 这个类做了修改,原先的写法在多账号的时候貌似没有将accessToken独立开, 可能会出现A微信号生成的accessToken-A 在内存中 ,B微信号获取accessToken的时候accessToken-A还未过期就会被拿来使用了,造成拿错accessToken的窘况.

这个是想做多账号支持的时候想去看老大的代码怎么区分accessToken , 可惜没找到, 所以自己做了修改, 不知是不是有其他地方有做这样机制,这样修改是否有这个必要.

以下是修改后的代码:

//防止多微信号的时候accessTokens串起来,将其改成map存在内存中
	private static Map<String,AccessToken> accessTokens = new HashMap<String,AccessToken>();
	
	public static AccessToken getAccessToken() {
		ApiConfig ac = ApiConfigKit.getApiConfig();
		AccessToken accessToken = accessTokens.get(ac.getAppId());
		if (accessToken != null && accessToken.isAvailable())
			return accessToken;
		
		refreshAccessToken();
		accessToken = accessTokens.get(ac.getAppId());
		return accessToken;
	}
	
	public static void refreshAccessToken() {
		requestAccessToken();
	}
	
	private static synchronized void requestAccessToken() {
		AccessToken result = null;
		ApiConfig ac = ApiConfigKit.getApiConfig();
		for (int i=0; i<3; i++) {
			String appId = ac.getAppId();
			String appSecret = ac.getAppSecret();
			Map<String, String> queryParas = ParaMap.create("appid", appId).put("secret", appSecret).getData();
			String json = HttpKit.get(url, queryParas);
			result = new AccessToken(json);
			
			if (result.isAvailable())
				break;
		}
		accessTokens.put(ac.getAppId(), result);
	}


这是修改前的代码:

private static AccessToken accessToken;
	
	public static AccessToken getAccessToken() {
		if (accessToken != null && accessToken.isAvailable())
			return accessToken;
		
		refreshAccessToken();
		return accessToken;
	}
	
	public static void refreshAccessToken() {
		accessToken = requestAccessToken();
	}
	
	private static synchronized AccessToken requestAccessToken() {
		AccessToken result = null;
		ApiConfig ac = ApiConfigKit.getApiConfig();
		for (int i=0; i<3; i++) {
			String appId = ac.getAppId();
			String appSecret = ac.getAppSecret();
			Map<String, String> queryParas = ParaMap.create("appid", appId).put("secret", appSecret).getData();
			String json = HttpKit.get(url, queryParas);
			result = new AccessToken(json);
			
			if (result.isAvailable())
				break;
		}
		return result;
	}




如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

乞讨 2021-11-28 12:23:29

谢谢波总~原来已经1.3了~ 我看的还是1.2的源码, 1.3已经改过来了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文