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

pansoso2021-04-19  29

重复提交原因

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

采用令牌措施

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

```

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

转载于:https://www.cnblogs.com/HashMap-Fantasy/p/8972313.html