zoukankan      html  css  js  c++  java
  • 学习Java 采取令牌的方式避免重复提交

    重复提交原因

    从提交页面到成功页面的跳转一般采用视图定位,由于视图定位是在服务端跳转的,如果用户在点击提交之后再次刷新页面,会导致重复提交,数据库的数据会有重复。

    采用令牌措施

    1、在转账展示页面生成一个随机的令牌号码,然后放入session和传参中。
     @RequestMapping("/toTrans")//
        public String toTrans(ModelMap modelMap, HttpSession session
        ) {//!
            //
            //如果是转账,则先查询余额
            String cardNo = (String) session.getAttribute("cardNo");
            String balance = cardInfoService.findByCardNo(cardNo).getBalance();
            modelMap.addAttribute("balance", balance);
            String token = UUID.randomUUID().toString();
            session.setAttribute("token",token);
            modelMap.addAttribute("token",token);
    
            //跳转到转账页面
            return "trans";
        }
    
    2、跳转到转账的trans.jsp文件,注意传参要输入name和value,否则Controller层找不到。
    ```
    <form id="transForm" class="am-form am-form-horizontal" action="/trans/doTrans.do" method="post">
    
    <input name="bToken" id="bToken" value="${token}"><%--传参要用name、value,否则Controller找不到--%>
    <div class="am-form-group">
        <div class="am-u-sm-9 am-u-sm-push-3">
            <button type="button" onclick="submitForm()" class="am-btn am-btn-primary">提交</button>
        </div>
    </div>
    
    ```

    3、获取传参的令牌与session中的令牌比较,看是否一样,一样则进入转账成功页面,否则转账失败。注意进入转账成功页面后需要销毁令牌,以防重复提交。

        @RequestMapping("/doTrans")//?
        public String doTrans(ModelMap modelMap, @RequestParam String bToken, HttpSession session, @RequestParam String checkInCardNo, @RequestParam String realName, @RequestParam String money) {//!
    
            try {
    
    
                String cardNo = (String) session.getAttribute("cardNo");
                String token = (String) session.getAttribute("token");
    
    
                cardInfoService.forward(cardNo, checkInCardNo, money, realName);
                if (!bToken.equals(token) || bToken == null || token == null) {
                    session.removeAttribute("token");/*此处可删可不删*/
                    return "fail";
                }
                session.removeAttribute("token");
                return "success";//?为什么success.jsp放在web-inf下面,返回地址会是tans/web-inf...
            } catch (Exception e) {
                e.printStackTrace();
                modelMap.addAttribute("msg", e.getMessage());
                return "fail";
            }
    
    
        }
    
    经过上述步骤,当进入转账成功页面后,因为令牌已经销毁,当用户再次刷新时,将会跳转到转账失败页面,从而避免了重读提交的问题。
  • 相关阅读:
    Android px,dp,pt,sp的差别
    C 八皇后
    线性表
    android 推断手机是否支持前置摄像头
    C/C++易错难点笔记01
    Java日志记录的5条规则
    hdoj-1312-Red and Black
    oracle 11g sql developer安装后无法使用
    显示指定时间的秒数
    云端自动化测试方案
  • 原文地址:https://www.cnblogs.com/HashMap-Fantasy/p/8972313.html
Copyright © 2011-2022 走看看