一、根据用户名和密码获取token
-
定义线程安全map
private static Map<String, String> tokenMap = new ConcurrentHashMap<>(4); private static final integer expireDays = 7;
- 刷新map
/** * 刷新token * @param token */ private void refreshTokenMap(String token) { if (StringUtils.isNotEmpty(token)) { tokenMap.clear(); tokenMap.put("time", LocalDateTime.now().toString()); tokenMap.put("token", token); } }
- 执行
@Override public String getToken() { if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) { return null; } // 从缓存池中获取token数据 String token = null; if (!tokenMap.isEmpty()) { String preTokenTime = tokenMap.get("time"); // 判断当前时间是否没有超过上一次token获取时间的7天后;1小时为误差值,即超过6天23小时即重新获取token boolean isValid= LocalDateTime.now().isBefore(LocalDateTime.parse(preTokenTime).plusDays(expireDays).minusHours(1)); if (isValid) { token = tokenMap.get("token"); } } if (StringUtils.isNotEmpty(token)) { return token; } //token获取不到或token失效则重新去请求token String requestUrl = url + "xxxx"; HttpEntity requestEntity = MultipartEntityBuilder.create() .setCharset(StandardCharsets.UTF_8) .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) .addTextBody("username", username) .addTextBody("password", password) .build(); HttpClientResult response = HttpClientUtils.doPost(requestUrl, requestEntity); if (response.getCode() != HttpStatus.OK.value()) { if(logger.isErrorEnabled()) { logger.error("获取token时发生错误,接口地址{}, ResponseStatusCode={}, ResponseContent={}", requestUrl, response.getCode(), response.getContent()); } return null; } final String content = response.getContent(); try { JSONObject contentObj = JSON.parseObject(content); token = contentObj.getString("token"); // 重新缓存token refreshTokenMap(token); }catch (Exception e) { if(logger.isErrorEnabled()) { logger.error("获取token时发生错误,JSON解析响应内容异常,responseContent={}", content); } return null; } return token; }