重复提交原因

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

采用令牌措施

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

最新文章

  1. ASP.NET MVC 从零开始 - 请求处理
  2. How to connect to Linux VM from Windows
  3. 两个不同的list随机组合到一个List中。
  4. jquery mobile 登陆后页面验证
  5. iOS自动布局进阶用法
  6. 【codevs1163】访问艺术馆
  7. MYSQL存储过程:批量更新数据
  8. 如何编写Angular指令
  9. MS-queue算法相关
  10. 第二百零三天 how can I 坚持
  11. 复制带有random指针的单链表
  12. 键盘快速启动工具Launchy的简单使用技巧
  13. java和Ajax
  14. rapid framework开发系列(一)
  15. 云服务器Windows Server2012 配置http服务器(又称Web服务器,IIS)
  16. springboot整合redis-sentinel支持Cache注解
  17. ctf study of jarvisoj reverse
  18. npm 传入参数
  19. Python3 图像边界识别
  20. 一个Python开源项目-哈勃沙箱源码剖析(下)

热门文章

  1. arcgis 加载高德地图 es6的方式
  2. Pwn with File结构体(二)
  3. memcached 的 SockIOPool 概念
  4. Memory map of an object array
  5. redis 概述、windows版本下载启动访问退出安装、中文乱码、RedisDesktopManager下载
  6. maven 骨架命令行创建
  7. java基础(八) 深入解析常量池与装拆箱机制
  8. Centos 使用C++11 编译
  9. C语言占位符
  10. 数据库对比:选择MariaDB还是MySQL?