随笔 - 1162  文章 - 0  评论 - 16  阅读 - 59万 

一、表单重复提交问题

  1、方式一

    提交完表单。 服务器使用请求转来进行页面跳转。 这个时候, 用户按下功能键 F5, 就会发起最后一次的请求。造成表单重复提交问题。 解决方法: 使用重定向来进行跳转

  2、方式二

    用户正常提交服务器, 但是由于网络延迟等原因, 迟迟未收到服务器的响应, 这个时候, 用户以为提交失败,就会着急, 然后多点了几次提交操作, 也会造成表单重复提交。

  3、方式三

    用户正常提交服务器。 服务器也没有延迟, 但是提交完成后, 用户回退浏览器。 重新提交。 也会造成表单重复提交。

二、解决方案

  为了防止用户重复提交或其他一些恶意的行为,可以在服务器端采用一定的措施防止用户重复提交,如下几种方案:

  1、使用 UUID

    UUID 是通用唯一识别码(Universally Unique Identifier)的缩写,是一个全球唯一的32为的16进制的随机数,它保证对在同一时空中的所有机器都是唯一的。

    思路:

      ① 在提交表单的 jsp 中生成一个 UUID,并将它作为 Token 存放到 session 域和表单的隐藏域中。

      ② 用户提交表单后,可以获取表单隐藏域中的 Token,然后再从 session 域中获取 Token

      ③ 比较两个 Token 是否相同,如果相同,进行提交,并且把 session 域中的 Token 移除;如果不同,则不进行提交工作。

   

 

    代码示例:

复制代码
 1 // 登录的 jsp 页面
 2     <%
 3         String uuid = UUID.randomUUID().toString().replace("-", "");
 4         session.setAttribute("uuid", uuid);
 5     %>
 6     <form action="LoginServlet" method="post">
 7         <input type="hidden" value="<%=uuid %>" name="uuid2">
 8         <label>用户名称:</label>
 9         <input class="itxt" type="text" placeholder="请输入用户名" autocomplete="off" tabindex="1" name="username" />
10         <br />
11         <br />
12         <label>用户密码:</label>
13         <input class="itxt" type="password" placeholder="请输入密码" autocomplete="off" tabindex="1" name="password" />
14         <br />
15         <br />
16         <input type="submit" value="登录" id="sub_btn" />
17     </form>
18     
19     //处理登录的 Servlet 
20     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
21         HttpSession session = request.getSession();
22         
23         //分别取session域和隐藏域中的uuid值
24         String uuid2 = request.getParameter("uuid2");
25         Object uuid = session.getAttribute("uuid");
26         
27         //判断是否相等,
28         if(uuid != null && uuid.toString().equals(uuid2)) {
29             //相等:提交,移除session域中的Token
30             System.out.println("提交啦!!!哈哈");
31             session.removeAttribute("uuid");
32         }
33         System.out.println("end!");
34 
35     }
复制代码

 

  2、使用验证码

 

    验证码

 

 

posted on   格物致知_Tony  阅读(166)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
历史上的今天:
2020-09-01 转换成十六进制
2019-09-01 Java 之 LinkedHashMap 集合
2019-09-01 Java 之 HashMap 集合
2019-09-01 Java 之 Map 接口
2019-09-01 JavaScript 之 navigator 对象
2019-09-01 JavaScript 之 history对象
2019-09-01 JavaScript 之 location 对象
点击右上角即可分享
微信分享提示

目录导航