组合模式:
@Override
public EdgeNode mock(String userId, String token, String sign) {
EdgeNode edgeNode = new EdgeNode();
baseService.service(token, sign, new HashMap<>(), new ServiceWrapper<ResponseDto>() {
@Override
public ResponseDto doLogic() {
ResponseDto responseDto=new ResponseDto();
EdgeNode edgeNode=new EdgeNode();
edgeNode.setEdgeNodeIp("127.0.0.1");
edgeNode.setUserId(userId);
responseDto.setData(edgeNode);
return responseDto;
}
});
return edgeNode;
}
public interface ServiceWrapper<T> {
/**
* 业务逻辑处理
*/
ResponseDto doLogic();
}
基础类
@Service
@Transactional
@Slf4j
public class BaseServiceBoImpl implements BaseService {
private static final String splitWord = "__";
private final static Logger logger = LoggerFactory.getLogger(BaseServiceBoImpl.class);
private String salt = "salt_aies"; // 盐
protected String encryptKeyDecode = "encrypt_aies"; // 加密秘钥
protected String signKeyDecode = "sign_aies"; // 签名秘钥
private static final int EXPIREDATE = 1; // token过期时间间隔-天
private static final String ENCODE = "utf-8"; // 编码
protected String userDB = "shuzhiping"; //数据库中查询
protected String secretDB = "password"; //加密后的,数据库中查询,原始:password
@Override
public ResponseDto checkTokenAndSign(String token, String sign, Map<String, String> params) {
logger.info("----checkTokenAndSign----" + params.toString());
ResponseDto result = new ResponseDto();
// 1、验证token是否为空
if (StringUtils.isEmpty(token) || StringUtils.isEmpty(sign)) {
String code = ErrorEnum.input_null.getCode();
result.setErrorcode(code);
result.setErrormsg("\"token or sign is null\"");
return result;
}
String decryptStr = DESUtil.decrypt(token, this.encryptKeyDecode);
String user = decryptStr.split(splitWord)[0];
String secret = decryptStr.split(splitWord)[1];
String timestamp = decryptStr.split(splitWord)[3];
// secret验证不通过
if (!secret.equals(secretDB) && !user.equals(userDB)) {
String code = ErrorEnum.secret_error.getCode();
result.setErrorcode(code);
result.setErrormsg(ErrorEnum.getMsg(code));
return result;
}
//验证过期
int diff_day = (int) ((System.currentTimeMillis() - Long.valueOf(timestamp)) / 1000 / 60 / 60 / 24); // 当前时间与token时间的时间差(天为单位)
if (diff_day > EXPIREDATE) {
String code = ErrorEnum.token_expired.getCode();
result.setErrorcode(code);
result.setErrormsg(ErrorEnum.getMsg(code));
return result;
}
// 2、验证签名(token和sign不做签名)是否一致
System.out.println("======" + JSON.toJSONString(params));
String newSign = SignatureUtil.sign(params, this.signKeyDecode, ENCODE);
if (!newSign.equals(sign)) {
String code = ErrorEnum.sign_failure.getCode();
result.setErrorcode(code);
result.setErrormsg(ErrorEnum.getMsg(code));
return result;
}
result.setErrorcode(ErrorEnum.ok.getCode());
return result;
}
@Override
public ResponseDto getToken(String user, String encodeSecret) {
ResponseDto result = new ResponseDto();
try {
String deSecret = DESUtil.decrypt(encodeSecret, this.encryptKeyDecode);// 解密用户的appSecret
// secret验证不通过
if (!deSecret.equals(secretDB) && !user.equals(userDB)) {
String code = ErrorEnum.secret_error.getCode();
result.setErrorcode(code);
result.setErrormsg(ErrorEnum.getMsg(code));
return result;
}
String timestamp = String.valueOf(System.currentTimeMillis());
String token = DESUtil.encrypt(user + splitWord + deSecret + splitWord + salt + splitWord + timestamp, this.encryptKeyDecode);
String code = ErrorEnum.ok.getCode();
result.setErrorcode(code);
result.setErrormsg(ErrorEnum.getMsg(code));
result.setData(token);
return result;
} catch (Exception e) {
String code = ErrorEnum.unknown_error.getCode();
result.setErrorcode(code);
result.setErrormsg(ErrorEnum.getMsg(code));
return result;
}
}
public ResponseDto checkRequest(Map<String, String> params) {
ResponseDto result = new ResponseDto();
String user = params.get("user");
// 判断必填
if (StringUtils.isEmpty(user)) {
String code = ErrorEnum.input_null.getCode();
result.setErrorcode(code);
result.setErrormsg(ErrorEnum.getMsg(code));
return result;
}
result.setErrorcode(ErrorEnum.ok.getCode());
return result;
}
@Override
public void service(String token, String sign, Map<String, String> params,
ServiceWrapper<ResponseDto> serviceWrapper) {
ResponseDto result = new ResponseDto();
boolean flag = true;
// 1、校验字段是否为空,如果有错误,只写日志
result = checkRequest(params);
if (!"0".equals(result.getErrorcode())) {
flag = false;
}
// 2、校验token和签名,如果有错误,只写日志
if (flag) {
result = checkTokenAndSign(token, sign, params);
if (!"0".equals(result.getErrorcode())) {
flag = false;
}
}
// 3、验空和token都没问题,执行业务逻辑操作
if (flag) {
result = serviceWrapper.doLogic();
}
// 4、写日志
writeLog(params, result);
}
@Override
public boolean checkInWhiteList(String ip) {
// String ipList = diamondConfigBo.getConfigByBuffer("white_list");
// // 如果请求的IP不在白名单里面,那么不允许访问
// if (!ipList.contains(ip)) {
// return false;
// }
return true;
}
/**
* 写调用log
*
* @param params
* @param result
*/
private void writeLog(Map<String, String> params, ResponseDto result) {
}
}