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

Posted hashmap-fantasy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习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";
    }


}

```

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

以上是关于学习Java 采取令牌的方式避免重复提交的主要内容,如果未能解决你的问题,请参考以下文章

关于struts2防止表单重复提交

Java 使用Token令牌防止表单重复提交

java程序如何获取POST方式提交的数据?

PHP避免刷新页面重复提交

JAVA后端生成Token(令牌),用于校验客户端,防止重复提交

Java中避免表单重复提交