javaWeb中用Session控制表单重复提交(9)

好记性不如烂笔头45-javaWeb中用Session控制表单重复提交(9)
在系统的正常使用中,特别是网速比较慢的情况下,用户提交表单后,发现服务器没有及时响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交。
1、 一些常见的表单重复提交的情况
【场景一】在网络延迟的情况下让用户有时间点击多次提交按钮导致表单重复提交
【场景二】表单提交后用户点击【刷新】按钮导致表单重复提交
【场景三】用户提交表单后,点击浏览器的【后退】按钮回退到表单页面后进行再次提交
【场景四】通过不同的浏览器登陆然后重复提交

2、 利用JavaScript防止表单重复提交
针对【场景一】使用JavaScript是可以解决这个问题的,解决的做法就是”用JavaScript控制Form表单只能提交一次”。
另一种方式就是表单提交之后,将提交按钮设置为不可用,让用户没有机会点击第二次提交按钮,
还有一种做法就是提交表单后,将提交按钮隐藏起来,这种做法和将提交按钮设置为不可用是差不多的。
这些做法可能会让用户误以为是bug(怎么我一点击按钮,按钮就不见了呢?用户可能会有这样的疑问)。
使用JavaScript防止表单重复提交的做法只对上述提交到导致表单重复提交的三种场景中的【场景一】有效,而对于其他场景是没有用,无法解决表单重复提交问题。

3、 利用Session防止表单重复提交
对于【场景二】和【场景三】导致表单重复提交的问题,既然客户端无法解决,那么就在服务器端解决,在服务器端解决就需要用到session了。

具体做法:在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token。然后将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端,然后在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务器端就可以不处理重复提交的表单。
如果相同则处理表单提交,处理完后需要立刻清除当前用户的Session域中存储的标识号。(否则重复的可能又来了)
  在下列情况下,服务器程序将拒绝处理用户提交的表单请求:
存储Session域中的Token(令牌)与表单提交的Token(令牌)不同。
当前用户的Session中不存在Token(令牌)。
用户提交的表单数据中没有Token(令牌)。

这种做法在单台服务的情况下是可行的,如果在复杂的大型系统中,必须要做保持会话的负载均衡,否则会导致session和正常token无法匹配。
额外优点:该做法还能防止系统被 Cross-site request forgery跨站请求伪造的攻击。

4、 防止表单重复提交的其他办法
场景四,从逻辑上来说,已经可以归纳到有恶意的使用范围里了。针对的一般都是免费服务,或者是获取类服务;而不是付出类服务(比如买东西)。
这种情况下,我们就要请数据库出马,记录用户的登陆状态,如果该用户已经登陆,或者注销一个;或者让第二个不能正常登陆。
这样基本上就能够保持一个用户登陆,用户通过在多种浏览器登陆;或者使用其他类似的方法,尽量规避它的发生。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值