• JavaWeb 案例9 — 表单重复提交问题


    一、表单重复提交问题

      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、使用验证码

        验证码

     

  • 相关阅读:
    LeetCode105. 从前序与中序遍历序列构造二叉树
    Flask 基础
    24个常用 Python 实现
    大佬的编码建议,让你的代码更pythonic
    rest-framework框架之序列化
    路飞学城项目之加入结算中心接口
    java异常与spring事务关系的知识点查漏补缺
    iserver-数据库型数据源导入后原dataset名称和数据库表名不一致的问题
    解决数据读取的负载均衡的问题
    Nginx反向代理、CORS、JSONP等跨域请求解决方法总结
  • 原文地址:https://www.cnblogs.com/niujifei/p/15214131.html
Copyright © 2020-2023  润新知