private JSONObject getToken() { JSONObject user = new JSONObject(); String s = redisTemplate.opsForValue().get("channelToken"); if (StringUtils.isNotBlank(s)) { try { String getTokenParam = "username=" + channelUser + "&password=" + channelPwd; user = JSON.parseObject(HttpUtils.doGet(getToken, getTokenParam, null)).getJSONObject("data"); redisTemplate.opsForValue().set("channelToken", user.toJSONString(), 60, TimeUnit.MINUTES); } catch (Exception e) { e.printStackTrace(); } } else { user = JSON.parseObject(s); } log.info("中台登录返回信息:{}", user); return user; }解释下代码
时间: 2024-04-27 08:20:20 浏览: 26
这段代码实现了获取用户 token 的功能。其中,首先从 Redis 中获取保存的 channelToken 字符串,如果字符串不为空,则将 channelUser 和 channelPwd 拼接成参数,通过 HttpUtils 工具类发送 GET 请求获取返回的数据,并将其中的 data 字段转换为 JSONObject 对象,最后将 JSONObject 对象转换为字符串存入 Redis 中,设置过期时间为 60 分钟,同时返回该对象。如果 Redis 中的 channelToken 字符串为空,则直接将字符串转换为 JSONObject 对象并返回。最后,使用 log.info() 输出返回的用户登录信息。
相关问题
private JSONObject getToken() { JSONObject user = new JSONObject(); String s = redisTemplate.opsForValue().get("channelToken"); if (StringUtils.isNotBlank(s)) { try { String getTokenParam = "username=" + channelUser + "&password=" + channelPwd; user = JSON.parseObject(HttpUtils.doGet(getToken, getTokenParam, null)).getJSONObject("data"); redisTemplate.opsForValue().set("channelToken", user.toJSONString(), 60, TimeUnit.MINUTES); } catch (Exception e) { e.printStackTrace(); } } else { user = JSON.parseObject(s); } log.info("中台登录返回信息:{}", user); return user; }解释下代码并且检查下是否有bug
这段代码的功能是从Redis缓存中获取渠道的token,如果缓存中没有,则通过HTTP请求获取,并将获取到的token存入缓存中,并返回一个JSON对象。如果缓存中有,则直接从缓存中获取,并返回一个JSON对象。
代码中的bug可能是在缓存中有token的情况下,会直接返回一个空的JSON对象,因为第二个if语句中的赋值语句应该放在第一个if语句的else分支中。应该改成如下代码:
```
private JSONObject getToken() {
JSONObject user = new JSONObject();
String s = redisTemplate.opsForValue().get("channelToken");
if (StringUtils.isNotBlank(s)) {
user = JSON.parseObject(s);
} else {
try {
String getTokenParam = "username=" + channelUser + "&password=" + channelPwd;
user = JSON.parseObject(HttpUtils.doGet(getToken, getTokenParam, null)).getJSONObject("data");
redisTemplate.opsForValue().set("channelToken", user.toJSONString(), 60, TimeUnit.MINUTES);
} catch (Exception e) {
e.printStackTrace();
}
}
log.info("中台登录返回信息:{}", user);
return user;
}
```
这样修改后,在缓存中有token的情况下,会直接从缓存中获取并返回正确的JSON对象。
ApiWxAuthorizeResponse apiResponse = new ApiWxAuthorizeResponse(); // final String KEY_PREFIX = "xcx_accessToken_"; try { // String redisData = strings.get(KEY_PREFIX + Const.APP_ID); String redisData = redisTemplate.opsForValue().get(token_cache_key); // log.info("生成token接口:access_token=" + redisData); LogUtils.debug("", com.eshore.small_program.common.log.definition.RequestMethod.GET, "生成token接口:access_token=" + redisData, 0l, 0l, 0l); WxMessageTokenResponse response; // 实际超时时间 long expiresIn; if (StringUtil.isBlank(redisData)) { getRedisSpinLock(token_get_key, 1000, 3); // 获取分布式锁 redisData = redisTemplate.opsForValue().get(token_cache_key); //重新获取redis值 } if (StringUtil.isBlank(redisData)) { // 缓存中不存在access_token // response = WxMessageUtil.getInstance().getToken(globalConfig, globalConfig.getAppId(), globalConfig.getAppSecret()); response = wxService.getToken(globalConfig.getAppId(), globalConfig.getAppSecret()); if (response == null) { return apiResponse; } // 设置key、value值 redisTemplate.opsForValue().set(token_cache_key, JSON.toJSONString(response), response.getExpires_in(), TimeUnit.SECONDS); // strings.set(KEY_PREFIX + Const.APP_ID, JSON.toJSONString(response)); // 设置key有效期 // keys.expired(KEY_PREFIX + Const.APP_ID, response.getExpires_in()); expiresIn = response.getExpires_in(); } else { response = JSON.parseObject(redisData, WxMessageTokenResponse.class); // expiresIn = keys.ttl(KEY_PREFIX + Const.APP_ID); expiresIn = redisTemplate.getExpire(token_cache_key, TimeUnit.SECONDS); } if (response != null) { apiResponse.setAccessToken(response.getAccess_token()); if (expiresIn > 60) { expiresIn = expiresIn - 60; } else { expiresIn = 0; } apiResponse.setExpiresIn(String.valueOf(expiresIn)); } logDebugExtension("{}", "authorize", JSONObject.toJSONString(apiResponse)); return apiResponse; } catch (Exception e) { log.error("异常:生成token接口失败", e); return apiResponse; } finally { releaseRedisLock(token_get_key); }
该代码段是一个生成access_token的方法。它首先尝试从redis缓存中获取access_token,如果缓存中不存在,则通过调用wxService的getToken方法从微信服务器获取access_token,并将其存储到redis缓存中。最后,它返回一个包含access_token和有效期的ApiWxAuthorizeResponse对象。
该方法的执行流程如下:
1. 创建一个ApiWxAuthorizeResponse对象apiResponse。
2. 尝试从redis缓存中获取access_token,存储在变量redisData中。
3. 如果redisData为空,则获取分布式锁,并重新从redis缓存中获取access_token。
4. 如果redisData仍然为空,则调用wxService的getToken方法获取access_token,并将其存储到redis缓存中。
5. 设置apiResponse的accessToken和expiresIn属性。
6. 记录日志并返回apiResponse。
7. 最后释放分布式锁。
如果在整个过程中发生异常,则记录错误日志并返回apiResponse。
请注意,代码中存在一些注释和日志记录,这些部分可能与代码的完整性和功能无关。