需求: 从本项目中访问另一个项目得token,首先得访问另一个项目的登录接口(sys/login),获得其token,若token在某一时间段内(40秒),则无需重新获取token,否则 重新获取token,然后在访问另一个项目的接口,并返回数据。
工具:使用了 Hutool一个小而全的Java工具类库。
1.安装Hutool,在项目的pom.xml的dependencies中加入以下内容:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
2.在yml文件中配置其路径
3.写一个配置文件
用到了三个注解
@Component @ConfigurationProperties(prefix = "sxjk-szgs-jiekou") 双引号中的要与yml文件中的相对应 @Data
4.获取第三方接口token
private static Map<String,String> tokenMap = null;
@Autowired
private SxjkSzgsJiekouConfig sxjkSzgsJiekouConfig;
/**
* 获取第三方项目token
* @return
*/
private static String token = null;
public String getToken() {
if(tokenMap==null){
tokenMap = new HashMap<>();
}
if(isTokenVail()){//判断token是否有值 且是否有效
// return tokenMap.get("token");
System.out.println("不需要获取新token");
}else{
long times = Calendar.getInstance().getTimeInMillis();
//获取用户密码
Map jsonbody = new HashMap();
jsonbody.put("username",sxjkSzgsJiekouConfig.getUsername());
jsonbody.put("password", sxjkSzgsJiekouConfig.getPassword());
String json = JSONUtil.toJsonStr(jsonbody);
//登录路径
String loginUrl = sxjkSzgsJiekouConfig.getUrl()+sxjkSzgsJiekouConfig.getLogin_url();
String login = HttpUtil.createPost(loginUrl).contentType("application/json")
.body(json).execute().body();
Map jsonMap = JSONUtil.toBean(login, Map.class);
if (jsonMap != null && jsonMap.get("code") != null && String.valueOf(jsonMap.get("code")).equals("200")) {
token = String.valueOf(((Map) jsonMap.get("result")).get("token"));
tokenMap.put("token",token);
tokenMap.put("timestrap", String.valueOf(times));
tokenMap.put("token_times", sxjkSzgsJiekouConfig.getTokenTimes());
// return token;
} else {
return null;
}
}
return tokenMap.get("token");
}
5.计算token时间戳
/**
* 计算时间戳
* @return
*/
private boolean isTokenVail(){
if(tokenMap.isEmpty()){
return false;
}else{
//时间戳
long timestrap = Long.parseLong(String.valueOf(tokenMap.get("timestrap")));
Date nowtime = new Date();
//当前时间戳
long times = Calendar.getInstance().getTimeInMillis();
long subtime = times - timestrap;
long tokenTimes = Long.parseLong(String.valueOf(tokenMap.get("token_times")));
if((tokenTimes-subtime)>20000){
return true;
}else{
return false;
}
}
}
6.访问第三方工具类
@Component
public class AccessApiUtil {
@Autowired
private TokenUtils tokenUtils;
/**
* 访问接口工具类
*
* @return
* @throws IOException
*/
public String selectApi(String url, Map<String, String> map) {
//获取token
String token = tokenUtils.getToken();
//发送post请求body传参并接收响应数据,也可以用from表单传参
String result = HttpUtil.createPost(url).header("Content-Type", "application/json")
.header("X-Access-Token",token)
.body(JSONUtil.toJsonStr(map))
.execute()
.body();
return result;
}
}
7.测试
/**
* 访问第三方接口
*
* @return
* @throws IOException
*/
@PreAuthorize("@ss.hasPermi('system:whptj:accessApi')")
@RequestMapping("/accessApi")
public Object accessApi(@RequestBody DateVo dateVo) {
Map<String, String> map = new HashMap<>();//存放参数
map.put("startDate", dateVo.getStartDate());
map.put("endDate", dateVo.getEndDate());
map.put("areaId", dateVo.getAreaId());
String url = sxjkSzgsJiekouConfig.getUrl()+dateVo.getApiUrl();
//访问第三方接口
String result = accessApiUtil.selectApi(url, map);
//可以有null
return JSONObject.parseObject(result);
//数据为null了 不显示
// return JSONUtil.parseObj(result,true);
}
每日一言:
鸡蛋,从外打破是食物,从内打破是生命,人生也是如此,从外打破是压力,从内打破是成长