Service防重复提交

wjf8882300 2015-08-18 10:33:30
现在在开发过程中经常遇到重复提交的情况,因为我们的架构是面向服务的模式,Service可以供web,android,ios,wap等多个平台调用,理论上可以在前端防重复提交,但这也不能完全避免,毕竟是有工具可以绕过去的。
现在我希望在service层完成防重复提交,之前一个做法是在提交数据库的时候加一个判断,但必须要写出类似这种insert into table (...) select ...where not exists (...);这个写起来麻烦,而且我们对数据库的操作用的是spring-data-jpa,改用上面那种写法要自己写insert语句不利于代码统一,且维护起来也不方便。
不知道大家有没有什么好方法防止重复提交?
...全文
287 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
liyongi 2019-05-31
  • 打赏
  • 举报
回复
引用 10 楼 <span style="color:#4788C7">QSEN1024</span>的回复:
你可以尝试在数据库里添加唯一约束或创建唯一索引,防止出现重复数据。这是最有效的防止重复提交数据的方法。
<br />ee
QSEN1024 2015-08-24
  • 打赏
  • 举报
回复
你可以尝试在数据库里添加唯一约束或创建唯一索引,防止出现重复数据。这是最有效的防止重复提交数据的方法。
sxiaobei 2015-08-21
  • 打赏
  • 举报
回复
引用 5 楼 wjf8882300 的回复:
[quote=引用 3 楼 sxiaobei 的回复:] 在每次提交数据时候都有一个版本号,如果两个版本号的时间间隔太短则算为重复提交
你这个还要改变表设计?把版本号存在库里才可以比较吧?我现在不希望改变现有表设计。[/quote] 其实重复提交一般都是加个时间戳什么的,作为版本号,不加版本号就不知道了,希望你早日解决
sxiaobei 2015-08-19
  • 打赏
  • 举报
回复
在每次提交数据时候都有一个版本号,如果两个版本号的时间间隔太短则算为重复提交
0萌萌哒0 2015-08-19
  • 打赏
  • 举报
回复
楼上的意思大致就是利用session,在每个用户提交的时候在session中放置一个标记,然后在提交时检查标记的存在与否,若不存在则允许提交,否则视为重复提交。当然,这个标记也应该在合适的时候(可以允许用户第二次提交该表单内容后)清除。
Inhibitory 2015-08-19
  • 打赏
  • 举报
回复
引用 7 楼 wjf8882300 的回复:
[quote=引用 6 楼 Inhibitory 的回复:] 防止表单重复提交 http://qtdebug.com/java/20.%20防止表单重复提交.html
这个我看过了,跟1楼的帖子几乎一样的。首先js防重意义不大,如果是恶意攻击的话,很容易就绕过js了。其次是token,在单服务器的时候没有问题,在多服务器的时候就有问题了。他本身的原理是在访问页面之前生成一个token存在session里面,在提交的时候判断之前生成的token与提交的token是否一致,不一致则认为重复提交。假设现在是两台服务器,请求页面是在A服务器生成token放在A服务器的内存session里面,提交时把结果提交到B服务器了,B服务器的session找不到A的token一样认为重复提交出错。当然你说把token单独用一条共享服务器存另算,不过那个改造太大了。而且移动端也不是先通过访问服务器的方式生成一个页面,这种方式比较适合web,不适合android和ios。[/quote] 其次是token,在单服务器的时候没有问题,在多服务器的时候就有问题了。 很简单,用 Redis 等存储 token 就可以了,这个我们都有考虑,服务器集群 Session 的问题都可以通过 Redis 来解决
wjf8882300 2015-08-19
  • 打赏
  • 举报
回复
引用 6 楼 Inhibitory 的回复:
防止表单重复提交 http://qtdebug.com/java/20.%20防止表单重复提交.html
这个我看过了,跟1楼的帖子几乎一样的。首先js防重意义不大,如果是恶意攻击的话,很容易就绕过js了。其次是token,在单服务器的时候没有问题,在多服务器的时候就有问题了。他本身的原理是在访问页面之前生成一个token存在session里面,在提交的时候判断之前生成的token与提交的token是否一致,不一致则认为重复提交。假设现在是两台服务器,请求页面是在A服务器生成token放在A服务器的内存session里面,提交时把结果提交到B服务器了,B服务器的session找不到A的token一样认为重复提交出错。当然你说把token单独用一条共享服务器存另算,不过那个改造太大了。而且移动端也不是先通过访问服务器的方式生成一个页面,这种方式比较适合web,不适合android和ios。
Inhibitory 2015-08-19
  • 打赏
  • 举报
回复
wjf8882300 2015-08-19
  • 打赏
  • 举报
回复
引用 3 楼 sxiaobei 的回复:
在每次提交数据时候都有一个版本号,如果两个版本号的时间间隔太短则算为重复提交
你这个还要改变表设计?把版本号存在库里才可以比较吧?我现在不希望改变现有表设计。
wjf8882300 2015-08-19
  • 打赏
  • 举报
回复
引用 1 楼 dcxy0 的回复:
之前遇到过的是使用token,因为是在web端,但是不知道其它客户端是不是也能用这个。 关于token : http://www.cnblogs.com/xdp-gacl/p/3859416.html
这个之前也考虑过,一则这需要改变前端和后端实现,二则就如文章所说多服务器节点的情况下,这种方式无法实现。
JPF1024 2015-08-18
  • 打赏
  • 举报
回复
之前遇到过的是使用token,因为是在web端,但是不知道其它客户端是不是也能用这个。 关于token : http://www.cnblogs.com/xdp-gacl/p/3859416.html

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧