欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

sessiom防止表单重复提交

程序员文章站 2022-07-02 23:44:50
...

第一种情况:表单提交成功以后,直接点击浏览器上回退按钮,不刷新页面,然后点击提交按钮再次提交表单。对数据库有操作,重复提交会给我们的数据库添加很多无意义,无效数据,如果对数据库有操作,将会对数据库添加很多无意义的数据
- 根本原因:因为服务器在处理请求时,不会检查是否为重复提交的请求。
- 解决方案:
使用一个token的机制
- token就是令牌的意思
- 服务器在处理请求之前先来检查浏览器的token
- token由服务器来创建,并交给浏览器,浏览器在向服务器发送请求时需要带着这个token
- 服务器处理请求前检查token是否正确,如果正确,则正常处理,否则返回一个错误页面
- 服务器所创建的token只能使用一次
- token一般使用一个唯一的标识
- 在jsp页面,获取uuid作为token
- UUID:32位字符串,通常作为对象或者表的唯一标识,根据机器码和时间戳(从1970年1月1日开始到现在)生成。
UUID含义是通用唯一识别码 (Universally Unique Identifier),javaJDK提供了UUID.randomUUID().toString()是一个自动生成主键的方法。它生成的值能保证对在同一时空中的所有机器都是唯一的,是由一个十六位的数字组成,表现出来的形式。UUID的唯一缺陷在于生成的结果串会比较长。
sessiom防止表单重复提交
第二种情况:在提交表单时,如果网速较差,可能会导致点击提交按钮多次,这种情况也会导致表单重复提交。
sessiom防止表单重复提交

以上内容转自于

钟洪发笔记

实现过程1–返回网页不刷新

在productdetails.jsp中相应位置写入代码:

<%
        String uuid= UUID.randomUUID().toString();
        session.setAttribute("uuid", uuid);
    %>

    <br><br>
    该产品的详细信息。
    <br><br>

将获取的uuid写入session

ShopController.java中addcar的方法里,加入验证:

@SuppressWarnings("unused")
    private void addcar(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String token = req.getParameter("token");//提交的令牌
        String sessionUuid = (String) req.getSession().getAttribute("uuid");//获取本地session的uuid(token)令牌
        req.getSession().removeAttribute("uuid");//要删除 只能使用一次
        if(token.equals(sessionUuid)) {//令牌有效 加入购物车
            String pname = req.getParameter("pname");
            HttpSession session = req.getSession();
            @SuppressWarnings("unchecked")
            List<String> list = (List<String>)session.getAttribute("car");
            if(null == list) {
                list = new ArrayList<>();
            }
            list.add(pname);
            session.setAttribute("car", list);
        }
        //resp.setCharacterEncoding("UTF-8");
        //resp.getWriter().println("添加成功!");
        resp.sendRedirect(req.getContextPath() + "/productcars.jsp");
    }

完成操作,进行验证。

实现过程2–网络延时

注意

360浏览器在正常情况下会连续提交两次。