对于Token防止重复提交的个人思考

本文探讨了使用Token防止表单重复提交的方法,通过设置唯一的Token值并结合后台验证机制,有效地避免了同一用户短时间内多次提交相同表单的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如题,对于Token防止重复提交的个人思考

首先需要在表单的hidden区域放入name = token,value = 随机值,这一步实际是通过后台回传进入页面嵌入表单的

那么我大概想象几个重复提交的场景

场景1:我打开一个表单页面,这时候里面已经有一个token值了,那么我们提交的时候卡住了,可是后台已经接受到我们的请求在处理了,这时候我们不耐烦,又点击了一下,这是又再次提交了,可是后台我们在session里已经设置了token的值了,会进行对比,其实对比前有一步判断为null的操作,那么第一次处理的时候对比不为null,可是然后到接下来对比的时候又是相同的,通过了那么得移除session中token的值,但是服务器还没有给予我们回应,这时候我们又再次提交的时候又进去判断,可是上一次操作,我们已经把session中的token移除了,所以这次在判断为null的操作中就失败了,return false了 所以,防止了一次重复操作

场景2:我打开2个相同的表单页面,但是这2个页面的token域的值其实就是不同的了,但是后台session只能允许一个key里一个值,所以2个页面提交的时候就可以判断同个用户的重复提交了


以上是个人的见解,具体如何利用token防止重复提交,在Struts2框架其实已经有提供类似的功能,但是SpringMVC则需要自己去实现,不过好在强大的百度有很多种方案

<think>好的,我现在要解决用户提出的问题:在若依框架下,一对多表格的校验只校验第一个,提交数据也只提交第一行,并且不使用Vue。我需要先理解用户的问题场景,然后分析可能的原因,最后给出解决方案。 首先,用户提到的若依框架是基于Spring Boot的权限管理系统,通常前端可能使用的是传统的HTML/JS,而不是Vue这样的前端框架。用户遇到的问题是,在一个一对多的表格中,前端校验只检查了第一行,提交时也只提交了第一行数据。这可能涉及到表单结构、前端校验逻辑以及后端接收数据的方式。 接下来,我需要考虑用户可能的前端结构。在传统HTML中,一对多表格通常通过动态添加行来实现,每行的输入字段可能有相同的name属性,比如name="itemList[0].fieldName"。但在动态添加行时,索引可能需要正确递增,比如itemList[1].fieldName、itemList[2].fieldName等,否则后端可能无法正确绑定为列表对象,导致只接收到第一个元素。 然后,校验问题。如果用户使用了一些前端校验库,或者在提交时手动进行校验,可能只检查了第一个元素。例如,如果校验逻辑是针对特定ID的元素,而动态添加的行没有正确的ID或没有被校验逻辑覆盖,就会导致只校验第一行。 提交数据的问题可能与前端的表单序列化方式有关。如果表单中没有正确生成所有行的name属性,或者在提交时没有正确收集所有行的数据,就会导致后端只能接收到第一行的数据。 接下来,我需要分步骤思考解决方案: 1. **表单结构检查**:确保每个动态添加的行中的输入字段的name属性正确,例如使用索引递增的方式,如itemList[0].fieldName、itemList[1].fieldName等。这样后端Spring MVC才能正确绑定到List对象。 2. **动态添加行的处理**:在添加新行时,需要更新索引值。例如,使用JavaScript在添加行时替换占位符索引为当前行数,确保每个字段的name正确。 3. **前端校验逻辑调整**:如果使用了如jQuery Validate等库,需要确保校验规则应用到所有动态添加的行。可能需要重新初始化校验插件,或者在提交时遍历所有行进行校验。 4. **提交数据处理**:确保表单提交时包含所有行的数据。可以通过JavaScript在提交前收集所有行的数据,或者确保表单的序列化能够包含所有动态添加的字段。 然后,我需要考虑可能的代码示例。例如,动态添加行时,使用JavaScript生成正确的name属性,并在提交时遍历所有行进行校验,最后使用Ajax或表单提交发送数据。 可能还需要检查后端控制器的参数绑定,确保使用@RequestBody或@RequestParam正确接收List类型的数据。 最后,总结可能的问题点和解决方案,确保用户能够逐步排查并解决问题。</think>在若依框架(非Vue版本)中,处理一对多表格校验与数据提交问题时,可按以下步骤排查和解决: --- ### **一、问题根源分析** 1. **表单字段命名问题** 动态添加的表格行未正确生成索引(如`list[0].name`、`list[1].name`),导致后端只能接收到第一个元素。 2. **前端校验范围限制** 校验逻辑仅绑定了首个表格行的DOM元素,未覆盖动态新增行。 3. **表单提交方式缺陷** 未正确序列化所有行的数据,或未通过JavaScript主动收集动态数据。 --- ### **二、解决方案** #### **步骤1:规范表单命名格式** ```html <!-- 首行 --> <input type="text" name="list[0].fieldName" required> <input type="text" name="list[0].remark"> <!-- 动态新增行(索引递增) --> <input type="text" name="list[1].fieldName" required> <input type="text" name="list[1].remark"> ``` #### **步骤2:动态添加行逻辑修正** ```javascript let rowIndex = 1; // 全局索引计数器 function addRow() { const newRow = ` <tr> <td><input name="list[${rowIndex}].fieldName" required></td> <td><input name="list[${rowIndex}].remark"></td> </tr> `; $("#tableBody").append(newRow); rowIndex++; } ``` #### **步骤3:手动校验所有行** ```javascript function validateForm() { let isValid = true; $('input[name^="list["][required]').each(function() { if ($(this).val().trim() === '') { alert("第" + $(this).closest('tr').index() + "行字段未填写!"); isValid = false; return false; // 终止遍历 } }); return isValid; } ``` #### **步骤4:提交前收集数据** ```javascript function submitForm() { if (!validateForm()) return; const formData = []; $('tr').each(function(index) { const fieldName = $(this).find('input[name$=".fieldName"]').val(); const remark = $(this).find('input[name$=".remark"]').val(); formData.push({ fieldName, remark }); }); // 通过Ajax提交或隐藏域赋值 $.ajax({ url: '/submit', type: 'POST', contentType: 'application/json', data: JSON.stringify(formData), success: function(res) { console.log('提交成功'); } }); } ``` --- ### **三、后端接收方式** Spring MVC控制器需使用`@RequestBody`接收List: ```java @PostMapping("/submit") public ResponseEntity<?> submit(@RequestBody List<MyEntity> list) { // 处理业务逻辑 return ResponseEntity.ok("success"); } ``` --- ### **四、注意事项** 1. **索引连续性** 确保动态添加行的索引连续无跳跃(如`list[0]`, `list[1]`, `list[2]`)。 2. **防止重复提交** 添加防重机制(如按钮禁用、Token验证)。 3. **兼容传统表单提交** 若使用非Ajax提交,需通过`<input type="hidden">`动态拼接数据。 通过以上步骤,可确保一对多表格的校验和提交覆盖所有行数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值