首页 > 编程语言 > 详细

学习Java 采取令牌的方式避免重复提交

时间:2018-04-29 23:47:30      阅读:338      评论:0      收藏:0      [点我收藏+]

重复提交原因

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

采用令牌措施

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";
    }


}

```

经过上述步骤,当进入转账成功页面后,因为令牌已经销毁,当用户再次刷新时,将会跳转到转账失败页面,从而避免了重读提交的问题。

学习Java 采取令牌的方式避免重复提交

原文:https://www.cnblogs.com/HashMap-Fantasy/p/8972313.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!