Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
无难事者若执
Spring Utils
提交
df192183
S
Spring Utils
项目概览
无难事者若执
/
Spring Utils
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
Spring Utils
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
df192183
编写于
8月 27, 2023
作者:
无难事者若执
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
doc : 【幂等】: 通过ThreadLocal传递TokenHolder和辅助验证value信息
上级
4cbc1462
变更
5
显示空白变更内容
内联
并排
Showing
5 changed file
with
104 addition
and
22 deletion
+104
-22
src/main/java/com/kx/Const.java
src/main/java/com/kx/Const.java
+0
-10
src/main/java/com/kx/utils/idempotent/bean/TokenHolder.java
src/main/java/com/kx/utils/idempotent/bean/TokenHolder.java
+51
-0
src/main/java/com/kx/utils/idempotent/impl/DefaultTokenValueRequestHolder.java
...utils/idempotent/impl/DefaultTokenValueRequestHolder.java
+13
-7
src/test/java/com/kx/test/IdTest.java
src/test/java/com/kx/test/IdTest.java
+26
-5
src/test/java/com/kx/test/IdempotentTest.java
src/test/java/com/kx/test/IdempotentTest.java
+14
-0
未找到文件。
src/main/java/com/kx/Const.java
浏览文件 @
df192183
...
@@ -10,14 +10,4 @@ public class Const {
...
@@ -10,14 +10,4 @@ public class Const {
*/
*/
public
static
final
String
BASE_PACKAGE
=
"com.kx.utils"
;
public
static
final
String
BASE_PACKAGE
=
"com.kx.utils"
;
/**
* 【幂等】默认请求体实现下,采用该方式作为携带的 token和value 参数列表
* <pre>
* Const.REQUEST_TOKEN_VALUE_ARGS[0] = "token"
* Const.REQUEST_TOKEN_VALUE_ARGS[1] = "userid"
*
* // 调用含有注解@Idempotent的类或方法,自动去传入到幂等 token校验中。
* </pre>
*/
public
static
final
String
[]
REQUEST_TOKEN_VALUE_ARGS
=
new
String
[
2
];
}
}
src/main/java/com/kx/utils/idempotent/bean/TokenHolder.java
0 → 100644
浏览文件 @
df192183
package
com.kx.utils.idempotent.bean
;
import
lombok.Getter
;
/**
* token 请求数据附加token结构
*
* @author kongxiang
*/
@Getter
public
class
TokenHolder
{
/**
* 线程唯一ThreadLocal持有
* 【幂等】默认请求体实现下,采用ThreadLocal方案来传递 线程内部 请求参数token的value的传递
* <pre>
* // 在线程执行之初时,赋值
* TokenHolder.setTokenHolder("1","2");
* // 调用含有注解@Idempotent的类或方法,自动去传入到幂等 token校验中。
* // 在幂等校验时获取
* * TokenHolder th = TokenHolder.getTokenHolder();
* ... boolean valid = idempotent...valid(th);
* </pre>
*/
private
static
final
ThreadLocal
<
TokenHolder
>
TOKEN_HOLDER_THREAD_LOCAL
=
new
ThreadLocal
<>();
public
static
TokenHolder
setTokenHolder
(
String
token
,
String
value
)
{
synchronized
(
TOKEN_HOLDER_THREAD_LOCAL
)
{
TokenHolder
tokenHolder
=
new
TokenHolder
();
tokenHolder
.
token
=
token
;
tokenHolder
.
validValue
=
value
;
TOKEN_HOLDER_THREAD_LOCAL
.
remove
();
TOKEN_HOLDER_THREAD_LOCAL
.
set
(
tokenHolder
);
return
tokenHolder
;
}
}
public
static
TokenHolder
getTokenHolder
()
{
synchronized
(
TOKEN_HOLDER_THREAD_LOCAL
)
{
return
TOKEN_HOLDER_THREAD_LOCAL
.
get
();
}
}
/**
* token
*/
private
String
token
;
/**
* 辅助认证信息
*/
private
String
validValue
;
}
src/main/java/com/kx/utils/idempotent/impl/DefaultTokenValueRequestHolder.java
浏览文件 @
df192183
package
com.kx.utils.idempotent.impl
;
package
com.kx.utils.idempotent.impl
;
import
com.kx.Const
;
import
com.kx.utils.idempotent.TokenValueRequestHolder
;
import
com.kx.utils.idempotent.TokenValueRequestHolder
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
;
import
com.kx.utils.idempotent.bean.TokenHolder
;
import
org.springframework.stereotype.Component
;
/**
/**
* 该框架默认支持的一种解决方案
* 该框架默认支持的一种解决方案
* 采用ThreadLocal注册
*
* @author kongxiang
* @author kongxiang
*/
*/
public
class
DefaultTokenValueRequestHolder
implements
TokenValueRequestHolder
{
public
class
DefaultTokenValueRequestHolder
implements
TokenValueRequestHolder
{
private
String
[]
args
=
Const
.
REQUEST_TOKEN_VALUE_ARGS
;
@Override
@Override
public
String
getToken
()
{
public
String
getToken
()
{
return
args
[
0
];
TokenHolder
token
=
TokenHolder
.
getTokenHolder
();
if
(
token
==
null
)
{
return
null
;
}
return
token
.
getToken
();
}
}
@Override
@Override
public
String
getValidValue
()
{
public
String
getValidValue
()
{
return
args
[
1
];
TokenHolder
token
=
TokenHolder
.
getTokenHolder
();
if
(
token
==
null
)
{
return
null
;
}
return
token
.
getValidValue
();
}
}
}
}
src/test/java/com/kx/test/IdTest.java
浏览文件 @
df192183
package
com.kx.test
;
package
com.kx.test
;
import
com.kx.config.ConfigPropertiesAutoConfiguration
;
import
com.kx.config.IdAutoConfiguration
;
import
com.kx.utils.id.IdService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.junit.Test
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.test.context.SpringBootTest
;
import
org.springframework.boot.test.context.SpringBootTest
;
import
org.springframework.context.annotation.Import
;
import
org.springframework.test.context.junit4.SpringJUnit4ClassRunner
;
@SpringBootTest
import
java.util.Set
;
public
class
IdTest
{
@SpringBootTest
(
classes
=
IdAutoConfiguration
.
class
)
@Import
(
ConfigPropertiesAutoConfiguration
.
class
)
@RunWith
(
SpringJUnit4ClassRunner
.
class
)
@Slf4j
public
class
IdTest
{
@Autowired
private
IdService
idService
;
@Test
@Test
public
void
IdGen
(){
public
void
IdGen
()
{
String
generate
=
idService
.
generate
();
assert
generate
!=
null
;
log
.
info
(
"generate : {}"
,
generate
);
String
uuid
=
idService
.
generate
(
"uuid"
);
assert
uuid
!=
null
;
log
.
info
(
"uuid : {}"
,
uuid
);
Set
<
String
>
supports
=
idService
.
supports
();
assert
supports
.
size
()
>
0
;
supports
.
forEach
(
System
.
out
::
println
);
}
}
}
}
src/test/java/com/kx/test/IdempotentTest.java
0 → 100644
浏览文件 @
df192183
package
com.kx.test
;
import
org.junit.Test
;
import
org.springframework.boot.test.context.SpringBootTest
;
@SpringBootTest
public
class
IdempotentTest
{
@Test
public
void
test
()
{
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录