<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>redis: host: 127.0.0.1 port: 6379 database: 0 password: # 连接超时时间 timeout: 10s
/**
* 防止表单重复提交注解
*/
@Target(ElementType.METHOD) // 注解的作用目标为方法
@Retention(RetentionPolicy.RUNTIME) // 注解的保留期限为运行时
public @interface PreventDuplicateSubmission {
/**
* 时间(s)
*/
int time() default 3;
}@Aspect // 表明这是一个切面类
@Component // 表示这是一个Bean
public class DuplicateSubmissionAspect {
@Autowired
private StringRedisTemplate stringRedisTemplate;
// 定义切入点,即标注了@PreventDuplicateSubmission注解的方法
@Pointcut("@annotation(com.example.demo.annotation.PreventDuplicateSubmission)")
public void preventDuplicateSubmission() {
}
@Around("preventDuplicateSubmission()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
assert attributes != null;
HttpServletRequest request = attributes.getRequest();
String requestURI = request.getRequestURI();
String key = requestURI + ":" + JSON.toJSONString(request.getParameterMap());
if (stringRedisTemplate.hasKey(key)) { // 如果Redis中已存在该请求
throw new RuntimeException("请勿重复提交");
}
// 获取注解的参数
PreventDuplicateSubmission formSubmission = ((MethodSignature) pjp.getSignature()).getMethod().getAnnotation(PreventDuplicateSubmission.class);
int time = formSubmission.time();
// 设置请求的key和value,有效期为3秒
stringRedisTemplate.opsForValue().set(key, "1", time, TimeUnit.SECONDS);
return pjp.proceed();
}
}在上面的代码中,我们使用了spring boot提供的stringredistemplate来连接redis,可以直接通过@autowired注解来注入该对象。在@around注解中,我们使用stringredistemplate.haskey()方法来检查redis中是否已存在该请求,如果存在,则抛出异常;如果不存在,则使用stringredistemplate.opsforvalue().set()方法将该请求存储到redis中,同时设置过期时间为3秒。
使用Redis存储请求需要注意以下几点:
Redis需要单独部署,不要将Redis和应用程序部署在同一台机器上。
Redis的性能相对于内存存储方式可能会有所下降,需要根据实际情况进行测试和优化。
如果Redis中出现异常,可能会影响到应用程序的正常运行,需要增加相应的容错机制。
Mootion
Mootion是一个革命性的3D动画创作平台,利用AI技术来简化和加速3D动画的制作过程。
232
查看详情
Redis存储请求需要考虑到并发问题,可以使用Redis的分布式锁来解决。
如果应用程序中需要频繁地进行Redis操作,可能会导至Redis的性能下降,因此需要注意优化Redis的配置和使用方式,例如使用Redis Pipeline等技术来提高Redis的性能。
以上就是SpringBoot怎么使用AOP+Redis防止表单重复提交的详细内容,更多请关注其它相关文章!
# 中文网
# 河北区数字营销推广平台
# 蕲春搜索推广网站有哪些
# 产品定制营销推广策略
# 孟州市营销推广招聘网
# 海口网站优化步骤
# 团风seo获客视频
# 龙文网站推广
# 微博营销推广平台怎么样
# 建设网站的平台有哪些
# 拉萨抖音seo费用
# 不存在
# redis
# 相关文章
# 是一个
# 如何实现
# 网络带宽
# 需要注意
# 这是一个
# 应用程序
# 表单
# aop
# SpringBoot
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
WPS文字如何进行简繁转换
高德地图怎么查看未来行程规划_高德地图未来行程规划查看方法
快手缓存清理方法
J*aScript实现网页表单实时输入字段比较与验证教程
PPT页面尺寸怎么修改 PPT自定义幻灯片大小与方向设置【教程】
Win10输入法不见了怎么办 Win10找回语言栏图标教程
Python项目中的条件导入:解决跨模块依赖问题
如何在Python中安全地将环境变量转换为整数并满足Mypy类型检查
在Peewee中处理PostgreSQL记录重复:一站式数据摄取教程
Animex动漫社正版在线入口 Animex动漫社动漫官方观看网
wps文字怎么设置文字环绕图片的方式_wps文字如何设置文字环绕图片方式
鲁班大师乓乓皮肤获取方法
使用CSS :has() 选择器实现父元素样式控制:从子元素反向应用样式
火狐浏览器无法自动更新怎么办 手动更新火狐浏览器到最新版本【解决】
附近酒吧怎么找?
猫眼app抢票快还是小程序快
抖音如何进行蓝V认证 抖音企业号申请所需资料与流程
Excel怎么用XLOOKUP函数实现双向查找_ExcelXLOOKUP替代VLOOKUP+HLOOKUP的高级用法
Flexbox布局实践:实现底部页脚与顶部粘性导航条的完美结合
win11如何开启单声道音频 Win11为听障用户合并左右声道【辅助】
《下一站江湖2》武器获取方法
edge浏览器怎么修改语言为中文_Edge界面语言切换教程
Mac hosts文件在哪里_Mac修改hosts文件详细教程
圆通快递官网入口查询单号 手机版官方查询入口
Win10如何查看已安装的更新补丁 Win10卸载指定更新教程【教程】
《我的恋爱逃生攻略》中文名字输入方法
《顺丰同城骑士》查看我的技能方法
qq邮箱格式填写示例 qq邮箱标准填写规范
猫眼电影app如何筛选支持退改签的影院_猫眼电影退改签影院筛选方法
抖音网页版官方链接 抖音网页版官网链接入口
优化Google Charts Gauge:在数据库无数据时显示默认值
如何在mysql中使用索引提示_mysql索引提示优化方法
CDR如何复制交互式填充色
动漫之家观看全集库 动漫之家免费资源网地址
抖音团长模式怎么做?团长模式是什么意思?
服装短视频如何起号推广?服装短视频起号推广有什么要求?
高德地图导航路线偏差报警频繁怎么办 高德地图路线偏差修复与优化方法
快递查询,一键速查
大众点评了却看不到是怎么回事
vivo云服务一直提示空间不足怎么办 怎么办vivo云服务老是提示空间不足
J*aScript:从子元素中批量移除特定CSS类
J*aScript调试技巧_性能分析与内存快照
汽水音乐车机版 汽水音乐车机版官方入口
Excel如何快速找到并断开外部数据源链接_Excel外部数据源断开方法
《异星探险家》古怪的物品作用介绍
TikTok视频播放中断怎么办 TikTok播放异常修复方法
《KARDS》冬季扩展包“国土阵线”上线!全新“协力”机制改变战场格局
深入理解J*aScript异步操作:setTimeout与调用栈的真相
iPhone12是否要更新ios16
mysql如何限制远程访问_mysql远程访问限制方法
2023-06-03
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。