Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
C
clx-performance
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
姜武杰
clx-performance
Commits
e55c3d18
提交
e55c3d18
authored
8月 27, 2024
作者:
jiangwujie
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat(sdk):测试lms-manage weight-sig sdk
上级
1f177f44
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
146 行增加
和
0 行删除
+146
-0
OpenEncrypt.java
...b/src/main/java/com/msl/common/open/core/OpenEncrypt.java
+146
-0
没有找到文件。
performance-web/src/main/java/com/msl/common/open/core/OpenEncrypt.java
0 → 100644
浏览文件 @
e55c3d18
package
com
.
msl
.
common
.
open
.
core
;
import
com.alibaba.fastjson.JSON
;
import
com.msl.common.base.Optional
;
import
com.msl.common.enums.ResultCodeEnum
;
import
com.msl.common.exception.ServiceSystemException
;
import
com.msl.common.open.OpenDto
;
import
com.msl.common.open.Process
;
import
com.msl.common.open.core.enums.OpenResultEnum
;
import
com.msl.common.open.core.processor.ProcessorRegistry
;
import
com.msl.common.result.Result
;
import
com.msl.common.utils.EncryptUtil
;
import
com.msl.common.utils.MslCollectionUtil
;
import
lombok.SneakyThrows
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.util.FileCopyUtils
;
import
org.springframework.validation.BindException
;
import
org.springframework.validation.FieldError
;
import
org.springframework.web.bind.MethodArgumentNotValidException
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.validation.ConstraintViolation
;
import
javax.validation.ConstraintViolationException
;
import
java.io.InputStreamReader
;
import
java.nio.charset.StandardCharsets
;
import
java.util.List
;
import
java.util.Objects
;
import
java.util.Set
;
/**
* @author wanglq
* Date 2024/4/30
* Time 17:13
*/
@Slf4j
public
class
OpenEncrypt
{
private
final
NamespacedEncryptAppFactory
appFactory
;
private
final
BusinessRegistry
businessRegistry
;
private
final
ProcessorRegistry
processorRegistry
;
public
OpenEncrypt
(
NamespacedEncryptAppFactory
appFactory
,
BusinessRegistry
businessRegistry
,
ProcessorRegistry
processorRegistry
)
{
this
.
appFactory
=
appFactory
;
this
.
businessRegistry
=
businessRegistry
;
this
.
processorRegistry
=
processorRegistry
;
}
/**
* 处理加密请求
*
* @param request
* @return
*/
@SneakyThrows
public
OpenDto
doWithEncrypt
(
HttpServletRequest
request
)
{
// 从body里面取数据
String
body
=
FileCopyUtils
.
copyToString
(
new
InputStreamReader
(
request
.
getInputStream
(),
StandardCharsets
.
UTF_8
));
OpenDto
openDto
=
JSON
.
parseObject
(
body
,
OpenDto
.
class
);
log
.
info
(
"OpenEncrypt接收到的加密参数-->{}"
,
JSON
.
toJSONString
(
openDto
));
EncryptApp
app
=
appFactory
.
getByAppId
(
openDto
.
getNamespace
(),
openDto
.
getAppId
())
.
orElseThrow
(
OpenResultEnum
.
APP_NOT_EXISTS
);
try
{
// 验证签名
if
(!
Objects
.
equals
(
openDto
.
getSign
(),
EncryptUtil
.
sign
(
app
.
getAppId
(),
app
.
getAppKey
(),
openDto
.
getData
(),
openDto
.
getTimestamp
())))
{
return
back
(
Result
.
fail
(
OpenResultEnum
.
SIGN_ERROR
),
app
);
}
// 验证请求时间戳是否超过10分钟
long
currentTimeMillis
=
System
.
currentTimeMillis
();
long
diff
=
Math
.
abs
(
currentTimeMillis
-
openDto
.
getTimestamp
());
if
(
diff
>
600000
)
{
return
back
(
Result
.
fail
(
OpenResultEnum
.
TIMESTAMP_ERROR
),
app
);
}
// 解密后参数
String
decrypt
=
EncryptUtil
.
decrypt
(
openDto
.
getData
(),
app
.
getAppKey
());
log
.
info
(
"OpenEncrypt接收到解密后的参数-->{}"
,
decrypt
);
//获取业务处理器
Optional
<
BusinessItem
<?>>
businessItemOptional
=
businessRegistry
.
getBusiness
(
openDto
.
getNamespace
(),
openDto
.
getOperate
());
if
(
businessItemOptional
.
isEmpty
())
{
log
.
info
(
"不支持的操作类型-->{}:{}"
,
openDto
.
getNamespace
(),
openDto
.
getOperate
());
return
back
(
Result
.
fail
(
"不支持的操作类型"
),
app
);
}
BusinessItem
<?>
business
=
businessItemOptional
.
get
();
//转换数据
Class
<?
extends
Process
<?>>
clazz
=
business
.
getClazz
();
Process
<?>
process
=
JSON
.
parseObject
(
decrypt
,
clazz
);
//创建上下文
ProcessContext
context
=
new
ProcessContext
()
.
setApp
(
app
)
.
setProcess
(
process
);
//流程链处理
processorRegistry
.
doProcess
(
context
);
//业务处理
return
back
(
Result
.
ok
(
business
.
doBusiness
(
app
,
process
)),
app
);
}
catch
(
ServiceSystemException
sse
)
{
log
.
warn
(
"OpenEncrypt请求处理失败: {}"
,
sse
.
getDetail
());
return
back
(
Result
.
fail
(
sse
.
getResultEnum
(),
sse
.
getDetail
()),
app
);
}
catch
(
ConstraintViolationException
e
)
{
StringBuilder
sb
=
new
StringBuilder
();
Set
<
ConstraintViolation
<?>>
violations
=
e
.
getConstraintViolations
();
for
(
ConstraintViolation
<?>
violation
:
violations
)
{
sb
.
append
(
violation
.
getMessage
()).
append
(
","
);
}
String
errMsg
=
sb
.
substring
(
0
,
sb
.
length
()
-
1
);
log
.
warn
(
"OpenEncrypt请求参数校验失败"
,
e
);
return
back
(
Result
.
fail
(
ResultCodeEnum
.
ILLEGAL_PARAMETER
,
errMsg
),
app
);
}
catch
(
Exception
e
)
{
if
(
e
instanceof
BindException
)
{
BindException
be
=
(
BindException
)
e
;
return
back
(
Result
.
fail
(
ResultCodeEnum
.
ILLEGAL_PARAMETER
,
exceptionMsg
(
be
.
getFieldErrors
())),
app
);
}
else
if
(
e
instanceof
MethodArgumentNotValidException
)
{
MethodArgumentNotValidException
me
=
(
MethodArgumentNotValidException
)
e
;
return
back
(
Result
.
fail
(
ResultCodeEnum
.
ILLEGAL_PARAMETER
,
exceptionMsg
(
me
.
getBindingResult
().
getFieldErrors
())),
app
);
}
log
.
error
(
"OpenEncrypt请求处理失败"
,
e
);
return
back
(
Result
.
fail
(),
app
);
}
}
public
static
void
main
(
String
[]
args
)
{
String
s
=
"{\"appId\":\"1121180185901704645\",\"data\":\"vrb1k2P8wLGVUN+B2J16TcAzdT/06Mkxrtk0p3jeqA/CUp03q/SdK4mgInzcXPClCWkB0AZIAL2H2mWVz7CX9JB9LULLvLC4zNrRf7L1uXLnlHmOacLGoXHMy5U3HanCPUIVOpYRIkzIddJVS3wCHoUi1PTxKAAY+QjiaqIhptUNSLnP07MUj37NYa+80BPlhNZ9dMrSZiPsZH8cr4VRQw==\",\"namespace\":\"trade-open\",\"operate\":\"trader.auth.apply\",\"sign\":\"48DF81292A0EC600EE8DF3553D1B7613\",\"timestamp\":1716378281402}"
;
OpenDto
openDto
=
JSON
.
parseObject
(
s
,
OpenDto
.
class
);
System
.
out
.
println
(
openDto
);
}
private
String
exceptionMsg
(
List
<
FieldError
>
fieldErrors
)
{
return
MslCollectionUtil
.
join
(
fieldErrors
,
FieldError:
:
getDefaultMessage
,
","
).
orNull
();
}
private
OpenDto
back
(
Result
<?>
res
,
EncryptApp
app
)
{
try
{
return
OpenDto
.
buildEncrypt
(
app
.
getAppId
(),
JSON
.
toJSONString
(
res
),
app
.
getAppKey
(),
System
.
currentTimeMillis
());
}
catch
(
Exception
e
)
{
log
.
error
(
"构造返回消息异常"
,
e
);
throw
new
RuntimeException
(
e
);
}
}
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论