学习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层找不到。
```
<%--传参要用name、value,否则Controller找不到--%>


 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 采取令牌的方式避免重复提交)