使用场景为:
有两个接口,
第一个接口返回一个accessToken,
第二个接口需要传递accessToken来获取数据,并且还需要传递一个签名参数,签名参数的签名规则为:
将第一个接口获取到的accessToken与一个签名密钥,当前时间戳进行base64加密,即 accessToken+":"+signSecret+":"+timestamp ,将这个串进行base64加密。
相当于第二个接口需要传递的参数为:accessToken,sign,timestamp。
signSecret的值前后端约定一致即可,这里是后端写死,前端放到报表的一个单元格上。
前端按照accessToken+":"+signSecret+":"+timestamp规则生成base64加密数据以sign参数传递到后台,
后端根据传递来的参数也生成一个base64加密数据,两者对比,对比成功返回数据。
第一个接口测试代码为:
@RequestMapping(
value = {"df_test/getAccessToken"},
method = {RequestMethod.GET}
)
@ResponseBody
public String getAccessToken(HttpServletRequest req, HttpServletResponse res) throws Exception {
String orginUrl = WebUtils.getOriginalURL(req);
LogManager.info(orginUrl);
String appId = req.getParameter("appId");
String appSeret = req.getParameter("appSeret");
HashMap resultMap = new HashMap();
resultMap.put("code", 200);
resultMap.put("errorMsg", "");
resultMap.put("data", new HashMap<>());
if ("abc".equals(appId) && "123456".equals(appSeret)) {
HashMap tokenMap = new HashMap();
tokenMap.put("accessToken", "asdasd123123234asdads");
resultMap.put("data", tokenMap);
} else {
resultMap.put("code", 1000);
resultMap.put("errorMsg", "appId,appSeret不正确");
}
return JSONUtils.toJSONString(resultMap);
}
第二个接口的测试代码为:
@RequestMapping(
value = {"df_test/getDatasByToken"},
method = {RequestMethod.GET}
)
@ResponseBody
public String getDatasByToken(HttpServletRequest req, HttpServletResponse res) throws Exception {
String accessToken = req.getParameter("accessToken");
String timestamp = req.getParameter("timestamp");
String sign = req.getParameter("sign");
String signSecret = "123456abc*&";
HashMap resultMap = new HashMap();
resultMap.put("code", 200);
resultMap.put("errorMsg", "");
ArrayList<HashMap> datas = new ArrayList<HashMap>();
resultMap.put("data", datas);
String mySign = Base64.getEncoder().encodeToString((accessToken + ":" + signSecret + ":" + timestamp).getBytes());
if (!mySign.equals(sign)) {
resultMap.put("code", 1000);
resultMap.put("errorMsg", "签名不正确");
} else {
if ("asdasd123123234asdads".equals(accessToken)) {
for (int i = 0; i < 5; i++) {
HashMap itemMap = new HashMap();
datas.add(itemMap);
itemMap.put("name", "学生" + (i + 1));
itemMap.put("age", 20 + i);
}
} else {
resultMap.put("code", 1000);
resultMap.put("errorMsg", "accessToken不正确");
}
}
return JSONUtils.toJSONString(resultMap);
}
配置如下
第一个接口的配置为:
测试结果为:
从图中可以看到已经获取到accessToken的值了。
第二个接口的配置为:
测试结果为:
从图中可以看到接口报签名错误的提示,这里我们还没有对sign参数进行base64加密,需要到设计器中去配置。
设计器中配置为:
运行截图:
从这里可以看到后台生成的mySign值与前端传递过来的sign值是一样的。这样就得到了数据。
|