diff --git a/README.md b/README.md
index f936503..3e50b21 100644
--- a/README.md
+++ b/README.md
@@ -9,6 +9,16 @@
> 客户端手动导入: ```mvn install:install-file -Dfile=agentcenter-sdk-1.0.0nsgk1.jar -DgroupId=com.nsgk -DartifactId=agentcenter-sdk -Dversion=1.0.0nsgk1 -Dpackaging=jar```
+> 客户端依赖:
+```
+
+
+ com.nsgk
+ agentcenter-sdk
+ 1.0.0nsgk1
+
+```
+
---
#### 兼容性
当版本不一致时
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSApiResult.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSApiResult.java
index 919dfd0..1748f53 100644
--- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSApiResult.java
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSApiResult.java
@@ -37,6 +37,21 @@ public final class NSApiResult
this.errno = errno;
}
+ NSApiResult(boolean suc, String msg, Object data)
+ {
+ this(suc, msg, data, NSErrno.ERRNO_OK);
+ }
+
+ NSApiResult(boolean suc, String msg, Object data, int errno)
+ {
+ this(suc, msg, data, System.currentTimeMillis(), errno);
+ }
+
+ NSApiResult(boolean suc, String msg, Object data, Long timestamp, int errno)
+ {
+ this(suc ? NS_RESULT_SUCCESS : NS_RESULT_ERROR, msg, data, timestamp, errno);
+ }
+
static NSApiResult Success(String msg, Object data)
{
return new NSApiResult(NS_RESULT_SUCCESS, msg, data);
@@ -56,7 +71,7 @@ public final class NSApiResult
jsonObject.getInteger("code"),
jsonObject.getString("msg"),
jsonObject.containsKey("data") ? jsonObject.get("data") : null,
- jsonObject.containsKey("data") ? jsonObject.getLong("timestamp") : null,
+ jsonObject.containsKey("timestamp") ? jsonObject.getLong("timestamp") : null,
jsonObject.containsKey("errno") ? jsonObject.getInteger("errno") : null
);
}
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDK.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDK.java
index 7f7589c..72069ac 100644
--- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDK.java
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDK.java
@@ -58,6 +58,16 @@ public final class NSSDK
return _identifier.get();
}
+ public static String PrivateKey()
+ {
+ return _privateKey.get();
+ }
+
+ public static String PublicKey()
+ {
+ return _publicKey.get();
+ }
+
public static NSSDKClient InstanceClient()
{
if(!NSConv.FALSE(_clientInit.get()))
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKClient.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKClient.java
index 1461963..4b5b714 100644
--- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKClient.java
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKClient.java
@@ -1,6 +1,8 @@
package com.nsgk.agentcentersdk.api;
import cn.hutool.core.util.URLUtil;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
import com.nsgk.agentcentersdk.core.NSConstants;
import com.nsgk.agentcentersdk.core.NSProtocol;
import com.nsgk.agentcentersdk.core.NSReportObject;
@@ -67,7 +69,7 @@ public final class NSSDKClient
NSNetworkResponse response = NSNetworkManager.Post(request);
NSErrGlobal.ASSERT(response.IsSuccess(), NSErrno.ERRNO_SYS_HTTP);
String json = response.getData();
- return NSApiResult.FromJSON(json);
+ return FromJSON(json);
}
private String BuildUrl(String url)
@@ -87,7 +89,7 @@ public final class NSSDKClient
dataStr = object.getDataStr();
try
{
- dataStr = NSCrypto.RSAEncrypt(dataStr, publicKey);
+ dataStr = NSCrypto.RSAEncrypt_publicKey(dataStr, publicKey);
NSAssert.NotEmpty(dataStr, NSErrno.ERRNO_SYS_ENCRYPT_FAIL);
}
catch(Exception e)
@@ -98,4 +100,28 @@ public final class NSSDKClient
}
request.setData(dataStr);
}
+
+ NSApiResult FromJSON(String str)
+ {
+ JSONObject jsonObject;
+
+ jsonObject = JSON.parseObject(str);
+ return new NSApiResult(
+ jsonObject.getInteger("code"),
+ jsonObject.getString("msg"),
+ UnwrapClientResponseData(jsonObject.get("data")),
+ jsonObject.containsKey("timestamp") ? jsonObject.getLong("timestamp") : null,
+ jsonObject.containsKey("errno") ? jsonObject.getInteger("errno") : NSErrno.ERRNO_OK
+ );
+ }
+
+ private Object UnwrapClientResponseData(Object data)
+ {
+ if(null != data)
+ {
+ if(data instanceof String)
+ data = NSCrypto.RSADecrypt_publicKey((String)data, publicKey);
+ }
+ return data;
+ }
}
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKServer.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKServer.java
index 2d2e600..0771754 100644
--- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKServer.java
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKServer.java
@@ -1,5 +1,6 @@
package com.nsgk.agentcentersdk.api;
+import com.alibaba.fastjson2.JSON;
import com.nsgk.agentcentersdk.core.NSConstants;
import com.nsgk.agentcentersdk.core.NSProtocol;
import com.nsgk.agentcentersdk.core.NSReportObject;
@@ -11,7 +12,6 @@ import com.nsgk.agentcentersdk.utility.NSArr;
import com.nsgk.agentcentersdk.utility.NSCrypto;
import com.nsgk.agentcentersdk.utility.NSHttp;
-import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
// SDK服务端
@@ -55,7 +55,7 @@ public final class NSSDKServer
;
try
{
- data = NSCrypto.RSADecrypt(data, privateKey);
+ data = NSCrypto.RSADecrypt_privateKey(data, privateKey);
NSAssert.NotEmpty(data, NSErrno.ERRNO_SYS_DECRYPT_FAIL);
res.SetDataStr(data, clazz);
NSErrGlobal.ASSERT(res.getData().Normalized() == 0, NSErrno.ERRNO_SYS_INVALID_FIELD);
@@ -83,19 +83,34 @@ public final class NSSDKServer
}
// 响应客户端
- public static NSApiResult Resp(int code, String msg, Object...data)
+ public NSApiResult Resp(boolean success, String msg, Object...data)
{
- return new NSApiResult(code, msg, NSArr.DefParm(data));
+ return new NSApiResult(success, msg, WrapClientResponseData(data));
}
- public static NSApiResult Success(String msg, Object...data)
+ public NSApiResult Resp(int errno, String msg, Object...data)
{
- return NSApiResult.Success(msg, NSArr.DefParm(data));
+ return new NSApiResult(errno == NSErrno.ERRNO_OK, msg, WrapClientResponseData(data), errno);
}
- public static NSApiResult Fail(int errno, String msg, Object...data)
+ public NSApiResult Success(String msg, Object...data)
{
- return NSApiResult.Error(errno, msg, NSArr.DefParm(data));
+ return NSApiResult.Success(msg, WrapClientResponseData(data));
}
+ public NSApiResult Fail(int errno, String msg, Object...data)
+ {
+ return NSApiResult.Error(errno, msg, WrapClientResponseData(data));
+ }
+
+ private Object WrapClientResponseData(Object...data)
+ {
+ Object o = NSArr.DefParm(data);
+ if(null != o)
+ {
+ if(!(o instanceof String))
+ o = NSCrypto.RSAEncrypt_privateKey(JSON.toJSONString(o), privateKey);
+ }
+ return o;
+ }
}
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSCrypto.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSCrypto.java
index ba63146..ec5be1f 100644
--- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSCrypto.java
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSCrypto.java
@@ -9,10 +9,21 @@ import cn.hutool.crypto.asymmetric.RSA;
import java.nio.charset.StandardCharsets;
// 加密工具
+// 加密数据返回都为base64, 解密数据传参都为base64
+// 客户端存放公钥, 服务端存放私钥
+/*
+ / ---------> \
+ 公钥加密 \ / -> 私钥解密
+ / \ / \
+客户端 服务端 处理/返回响应
+ \ / \ /
+ 公钥解密 / \ <- 私钥加密
+ \ <--------- /
+ */
public final class NSCrypto
{
// RSA公钥加密(客户端) raw -> base64
- public static String RSAEncrypt(String rawData, String publicKey_base64)
+ public static String RSAEncrypt_publicKey(String rawData, String publicKey_base64)
{
RSA rsa;
@@ -23,7 +34,7 @@ public final class NSCrypto
}
// RSA私钥解密(服务端) base64 -> raw
- public static String RSADecrypt(String encryptBase64Data, String privateKey_base64)
+ public static String RSADecrypt_privateKey(String encryptBase64Data, String privateKey_base64)
{
RSA rsa;
@@ -33,5 +44,27 @@ public final class NSCrypto
return StrUtil.str(rsa.decrypt(Base64.decode(encryptBase64Data), KeyType.PrivateKey), StandardCharsets.UTF_8);
}
+ // RSA私钥加密(服务端) raw -> base64
+ public static String RSAEncrypt_privateKey(String rawData, String privateKey_base64)
+ {
+ RSA rsa;
+
+ if(NSStr.IsEmpty(rawData) || NSStr.IsEmpty(privateKey_base64))
+ return "";
+ rsa = SecureUtil.rsa(privateKey_base64, null);
+ return rsa.encryptBase64(rawData, KeyType.PrivateKey);
+ }
+
+ // RSA公钥解密(客户端) base64 -> raw
+ public static String RSADecrypt_publicKey(String encryptBase64Data, String publicKey_base64)
+ {
+ RSA rsa;
+
+ if(NSStr.IsEmpty(encryptBase64Data) || NSStr.IsEmpty(publicKey_base64))
+ return "";
+ rsa = SecureUtil.rsa(null, publicKey_base64);
+ return StrUtil.str(rsa.decrypt(Base64.decode(encryptBase64Data), KeyType.PublicKey), StandardCharsets.UTF_8);
+ }
+
private NSCrypto() {}
}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/agentcenter/AgentCenterController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/agentcenter/AgentCenterController.java
index 1453d80..aae0d08 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/agentcenter/AgentCenterController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/agentcenter/AgentCenterController.java
@@ -53,23 +53,22 @@ public class AgentCenterController extends BaseController
@PostMapping("/report")
public NSApiResult report(HttpServletRequest request)
{
+ NSSDKServer server;
+
+ NSSDK.InitServer(RuoYiConfig.Secret.privateKey);
+ server = NSSDK.InstanceServer();
try
{
- Result> result = agentCenter.postHandle(request);
- return response(result);
+ Result> result = agentCenter.postHandle(server, request);
+ return server.Resp(result.getCode(), result.getMessage(), result.getData());
}
catch(NSException e)
{
- return NSSDKServer.Fail(e.getErrno(), e.getMessage());
+ return server.Fail(e.getErrno(), e.getMessage());
}
catch(Exception e)
{
- return NSSDKServer.Fail(NSErrno.ERRNO_ERROR, e.getMessage());
+ return server.Fail(NSErrno.ERRNO_ERROR, e.getMessage());
}
}
-
- private NSApiResult response(Result> result)
- {
- return NSSDKServer.Resp(result.getCode(), result.getMessage(), result.getData());
- }
}
diff --git a/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/object/Result.java b/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/object/Result.java
index 9770c05..ae5a95c 100644
--- a/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/object/Result.java
+++ b/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/object/Result.java
@@ -1,5 +1,6 @@
package com.ruoyi.agentcenter.object;
+import com.nsgk.agentcentersdk.err.NSErrno;
import lombok.Data;
import lombok.experimental.Accessors;
@@ -11,4 +12,9 @@ public class Result
private int code;
private String message;
private R data;
+
+ public boolean IsSuccess()
+ {
+ return code == NSErrno.ERRNO_OK;
+ }
}
diff --git a/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/IAgentCenter.java b/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/IAgentCenter.java
index 439d9dd..11bf7e2 100644
--- a/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/IAgentCenter.java
+++ b/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/IAgentCenter.java
@@ -1,10 +1,11 @@
package com.ruoyi.agentcenter.service;
+import com.nsgk.agentcentersdk.api.NSSDKServer;
import com.ruoyi.agentcenter.object.Result;
import javax.servlet.http.HttpServletRequest;
public interface IAgentCenter
{
- public Result> postHandle(HttpServletRequest request);
+ public Result> postHandle(NSSDKServer server, HttpServletRequest request);
}
diff --git a/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/impl/AgentCenterImpl.java b/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/impl/AgentCenterImpl.java
index cd4e258..d8e4cb6 100644
--- a/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/impl/AgentCenterImpl.java
+++ b/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/impl/AgentCenterImpl.java
@@ -1,8 +1,6 @@
package com.ruoyi.agentcenter.service.impl;
import cn.hutool.core.lang.Assert;
-import cn.hutool.core.util.URLUtil;
-import com.nsgk.agentcentersdk.api.NSSDK;
import com.nsgk.agentcentersdk.api.NSSDKServer;
import com.nsgk.agentcentersdk.core.NSProtocol;
import com.nsgk.agentcentersdk.core.NSReportObject;
@@ -16,17 +14,13 @@ import com.ruoyi.agentcenter.object.Message;
import com.ruoyi.agentcenter.object.Result;
import com.ruoyi.agentcenter.object.Session;
import com.ruoyi.agentcenter.service.IAgentCenter;
-import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.core.domain.entity.SysDept;
-import com.ruoyi.common.utils.EventBusEngine;
import com.ruoyi.common.utils.handler.HandlerEngine;
import com.ruoyi.system.mapper.SysDeptMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
-import java.net.URL;
-import java.util.Date;
@Service
public class AgentCenterImpl implements IAgentCenter
@@ -45,14 +39,11 @@ public class AgentCenterImpl implements IAgentCenter
return protocol;
}
- public Message> getMessage(HttpServletRequest request)
+ public Message> getMessage(NSSDKServer server, HttpServletRequest request)
{
- NSSDKServer server;
NSReportObject> reportObject;
Message> message;
- NSSDK.InitServer(RuoYiConfig.Secret.privateKey);
- server = NSSDK.InstanceServer();
int protocol = getProtocol(request);
Class extends NSEntity> clazz;
switch(protocol)
@@ -113,9 +104,9 @@ public class AgentCenterImpl implements IAgentCenter
}
@Override
- public Result> postHandle(HttpServletRequest request)
+ public Result> postHandle(NSSDKServer server, HttpServletRequest request)
{
- Message> message = getMessage(request);
+ Message> message = getMessage(server, request);
check(message, request);
Session, ?> session = createSession(message);
HandlerEngine.Post(session);