签章缓存定义
概述
在实际开发过程中,我们经常会遇到需要将某种标识型数据缓存一定时间的需求。例如:手机短信验证码、登录错误次数记录等。这一类需求代码实现逻辑除了生成标识数据值的方式(有些可能不需要标识值),基本都是一致的。
为了方便开发,Dante Cloud 将这一需求进行抽象,并提取了一个专门的概念【签章】。
[一]使用方法
开发一个“签章”功能非常简单,编写一类,继承 cn.herodotus.stirrup.cache.jetcache.stamp.AbstractStampManager
抽象类。然后根据自己指定的签章值的类型,指定值的生成策略即可。
示例代码如下,这个示例是 Dante Cloud 中生成手机验证码的源代码:
public class VerificationCodeStampManager extends AbstractStampManager<String, String> {
private final SmsProperties smsProperties;
public VerificationCodeStampManager(SmsProperties smsProperties) {
super(AccessConstants.CACHE_NAME_TOKEN_VERIFICATION_CODE);
this.smsProperties = smsProperties;
}
@Override
public String nextStamp(String key) {
if (smsProperties.getSandbox()) {
return smsProperties.getTestCode();
} else {
return RandomUtil.randomNumbers(smsProperties.getLength());
}
}
@Override
public void afterPropertiesSet() throws Exception {
super.setExpire(smsProperties.getExpire());
}
public Boolean getSandbox() {
return smsProperties.getSandbox();
}
public String getVerificationCodeTemplateId() {
return smsProperties.getVerificationCodeTemplateId();
}
}
如果 cn.herodotus.stirrup.cache.jetcache.stamp.AbstractStampManager
不能满足你的需求,您可以选择直接实现 cn.herodotus.stirrup.cache.jetcache.stamp.StampManager
接口,来实现你的逻辑。
[二]缓存方式
Dante Cloud 中的【签章】,是基于 JetCache
缓存组件实现。 Jetcache
支持本地(Caffeine)和远程(Redis)缓存,也支持多级缓存的混用。
在 cn.herodotus.stirrup.cache.jetcache.stamp.AbstractStampManager
默认实现中,使用的是 JetCache
多级缓存模式,即本地和远程都会存储缓存数据,这样就可以很便捷的支持服务多实例的场景。
当然,您也可以根据自己的需求进行调整,例如:只想将数据存储在服务本地,或者只想将数据存储在远程 Redis 中。
想要进行更改也非常方便,仅需要再你的签章实现类中,实现 cn.herodotus.stirrup.cache.jetcache.stamp.AbstractStampManager
,类的不同构造函数。
public class MyStampManager extends AbstractStampManager<String,String> {
public MyStampManager(String cacheName) {
super(cacheName, CacheType.REMOTE);
}
@Override
public String nextStamp(String key) {
return "";
}
@Override
public void afterPropertiesSet() throws Exception {
}
}
说明
CacheType
是 JetCache
中内置的缓存类型枚举。
CacheType.REMOTE
指的是仅是远程存储(一般为 Redis,具体要看你实际的 JetCache 配置)CacheType.LOCAL
指的是仅本地存储(一般为 Caffeine,具体要看你实际的 JetCache 配置)CacheType.BOTH
指的是本地和远程同时存储,即多级模式。
[三]系统应用
在 Dante Cloud 已经大量在使用【签章】定义来简化开发。
SignInFailureLimitedStampManager
:登录失败次数限制签章AccessLimitedStampManager
:接口防刷签章EmailVerificationCodeStampManager
:Email验证码签章HttpCryptoProcessor
:前后端加解密签章IdempotentStampManager
:幂等签章JustAuthStateStampManager
:JustAuth State 参数签章LockedUserDetailsStampManager
:账号锁定签章VerificationCodeStampManager
:验证码签章
在图形验证码方面,使用的也非常多
JigsawCaptchaRenderer
:滑动拼图验证码签章WordClickCaptchaRenderer
:文字点选验证码签章ChineseGifCaptchaRenderer
:汉字GIF图形验证码签章SpecGifCaptchaRenderer
:字母数字GIF图形验证码签章ChineseCaptchaRenderer
:汉字图形验证码签章SpecCaptchaRenderer
:字母数字图形验证码签章ArithmeticCaptchaRenderer
:算数计算验证码签章CircleCaptchaRenderer
:Hutool圆圈干扰验证码签章GifCaptchaRenderer
:HutoolGif验证码签章LineCaptchaRenderer
:Hutool线型验证码签章ShearCaptchaRenderer
:Hutool扭曲干扰验证码签章
[四]用户标识
在有些签章需求中,需要依赖于可以区分用户身份的标识进行区分。因为签章缓存的时效性较高,而且很多应用场景是在用户未登录的场景。所以,使用标注的用户信息,比如:userId,来区分不同的身份信息明显不现实。
在 Dante Cloud 采用是 SessionID
来区分不同的用户身份信息。这样就保证了不同场景下,用户身份的区分,也支持用户未登录的场景。
提示
想要了解如何在复杂的分布式架构中彻底解决 Session 一致性问题,可以阅读付费阅读
文章 《OAuth 2 中的 Scope 与 Role 深度解析》
,购买方式详见:【高阶文档】