重覆提交原因 從提交頁面到成功頁面的跳轉一般採用視圖定位,由於視圖定位是在服務端跳轉的,如果用戶在點擊提交之後再次刷新頁面,會導致重覆提交,資料庫的數據會有重覆。 採用令牌措施 1、在轉賬展示頁面生成一個隨機的令牌號碼,然後放入session和傳參中。 2、跳轉到轉賬的trans.jsp文件,註意傳 ...
重覆提交原因
從提交頁面到成功頁面的跳轉一般採用視圖定位,由於視圖定位是在服務端跳轉的,如果用戶在點擊提交之後再次刷新頁面,會導致重覆提交,資料庫的數據會有重覆。
採用令牌措施
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";
}
}
```