sessiom防止表单重复提交

第一种情况:表单提交成功以后,直接点击浏览器上回退按钮,不刷新页面,然后点击提交按钮再次提交表单。对数据库有操作,重复提交会给我们的数据库添加很多无意义,无效数据,如果对数据库有操作,将会对数据库添加很多无意义的数据
- 根本原因:因为服务器在处理请求时,不会检查是否为重复提交的请求。
- 解决方案:
使用一个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的唯一缺陷在于生成的结果串会比较长。
这里写图片描述
第二种情况:在提交表单时,如果网速较差,可能会导致点击提交按钮多次,这种情况也会导致表单重复提交。
这里写图片描述

以上内容转自于

钟洪发笔记

实现过程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浏览器在正常情况下会连续提交两次。

猜你喜欢

转载自blog.csdn.net/footprint01/article/details/82528230
今日推荐