JS以及Java防止数据重复提交

本文讨论了仅使用JavaScript难以完全避免数据重复提交的问题,并指出需要前后端配合解决。提供了参考资料链接。
### 防止Java Web应用程序中因快速连续点击引起的表单或请求重复提交 #### 使用Token机制验证请求合法性 为了防止用户通过多次点击按钮而造成的数据重复提交,在服务器端可以采用Token机制。当页面加载时,服务端生成唯一的Token并存储于HttpSession对象内,同时将其传递给客户端浏览器;在每次接收到带有此令牌的POST请求之后立即删除它,这样即使恶意攻击者试图再次发送相同的内容也无法得逞[^1]。 ```java String token = (String) session.getAttribute("CSRF_TOKEN"); if(token != null && token.equals(request.getParameter("token"))){ // 处理业务逻辑... }else{ // 跳转到错误提示页 } request.getRequestDispatcher("/WebRoot/common/error/jsp/error_message.jsp").forward(request,response); ``` #### 前端JavaScript禁用提交按钮 除了依靠后端防护措施外,还可以利用前端技术手段辅助解决这个问题。例如可以在HTML文档中的`<form>`标签上绑定事件监听器,在触发submit动作的同时立刻设置该控件为不可编辑状态(`disabled="true"`),从而阻止后续可能发生的额外操作尝试[^2]。 ```html <form id="myForm"> <!-- 表单项 --> <button type="submit">Submit</button> </form> <script> document.getElementById('myForm').addEventListener('submit', function(event){ event.target.querySelector('[type=submit]').setAttribute('disabled','true'); }); </script> ``` 需要注意的是,仅依赖上述方式并不安全可靠,因为熟练掌握网络编程技巧的人士能够轻易绕过这些限制条件,所以建议综合运用多种策略共同构建更加坚固的安全防线。 #### 利用Redis分布式锁控制并发访问 对于高并发场景下的防重提需求,则推荐引入缓存组件如Redis来协助完成这项工作。具体做法是以当前用户的Token(或者JSessionId)加上请求路径作为key值向redis申请加锁,只有第一个成功获得锁定权限的操作才会被允许继续执行下去,其余未获授权者则需等待一段时间后再重新发起新一轮竞争过程直至超时放弃为止[^3]。 ```java public boolean tryLock(String key,long timeoutSecs){ Rlock lock = redissonClient.getLock(key); return lock.tryLock(timeoutSecs, TimeUnit.SECONDS); } // Controller层调用示例 @PostMapping("/save") @ResponseBody public String save(@RequestParam Map<String,Object> params, HttpSession session){ boolean locked = false; try { locked = tryLock(getUniqueKey(session.getId(), "/save"), 5L); if (!locked) return "too many requests"; // 执行保存业务... }catch(Exception e){ throw new RuntimeException(e.getMessage()); }finally{ if(locked){ unlock(getUniqueKey(session.getId(),"/save")); } } return "success"; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值