import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
/**
* 对外接口服务
*/
@RestController
@RequestMapping("/external")
public class ExternalController {
/**
* MD5密钥(这里写入自己的密钥)
*/
private static final String KEY = "************";
/**
* @描述 外部调用接口时传入的数据安全验证
* @参数 [body]:data存放入参数据,encStr存放加密串,dateTime 存放时间戳
*/
public void validation(JSONObject body) {
String encStr = body.getString("encStr");
JSONObject data = body.getJSONObject("data");
Long dateTime = body.getLong("dateTime");
String str = "key:" + KEY + ",data:" + JSON.toJSONString(data) + ",date:" + dateTime;
String md5 = DigestUtils.md5DigestAsHex(str.getBytes());
if (!StringUtils.equals(md5, encStr)) {
throw new RuntimeException("令牌错误,无调用权限");
}
}
/**
* @描述 外部接口调用入参规则示例
*/
public static void main(String[] args) {
JSONObject body = new JSONObject();
JSONObject data = new JSONObject();
//约定传入参数
data.put("type", 1);
data.put("key1", "*******");
data.put("key2", "*******");
//添加时间后,实时变更密钥串,防止获取固定密钥串
Date date = new Date();
long dateTime = date.getTime();
//加密方式,内置参数请勿挪动位置,否则验证失败
String str = "key:" + KEY + ",data:" + JSON.toJSONString(data) + ",date:" + dateTime;
//MD5加密
String md5 = DigestUtils.md5DigestAsHex(str.getBytes());
body.put("data", data);
body.put("encStr", md5);
body.put("dateTime", dateTime);
//打印出最终传参,方便复制
System.out.println(JSON.toJSONString(body));
}
/**
* @描述 这里举例(假设该接口为外部接口,调用内部接口 validation方法)
* @参数 []
* @返回值 void
*/
@GetMapping("/callValidation")
public void callValidation() {
JSONObject body = new JSONObject();
JSONObject data = new JSONObject();
//约定传入参数
data.put("type", 1);
data.put("key1", "*******");
data.put("key2", "*******");
//添加时间后,实时变更密钥串,防止获取固定密钥串
Date date = new Date();
long dateTime = date.getTime();
//加密方式,内置参数请勿挪动位置,否则验证失败
String str = "key:" + KEY + ",data:" + JSON.toJSONString(data) + ",date:" + dateTime;
//MD5加密
String md5 = DigestUtils.md5DigestAsHex(str.getBytes());
body.put("data", data);
body.put("encStr", md5);
body.put("dateTime", dateTime);
//调用接口,此处主要是演示,外部调用时可以使用client通过http方式调用
validation(body);
}
}
网友评论