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

}

```

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

原文地址:https://www.cnblogs.com/HashMap-Fantasy/p/8972313.html

时间: 2024-08-04 22:08:23

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

学习java前端 两种form表单提交方式

第一种:原生方式 注意点:button标签的style为submit <form action="/trans/doTrans.do" method="post"> 转出卡号:${cardNo} <br> 转出卡号余额:${balance}元 <br> <br> 转入卡号:<input name="checkInCardNo" type="text"> <br&

Android学习之Http使用Post方式进行数据提交

转自:http://blog.csdn.net/wulianghuan/article/details/8626551 我们知道通过Get方式提交的数据是作为Url地址的一部分进行提交,而且对字节数的长度也有限制,与Get方式类似,http-post参数也是被URL编码的,然而它的变量名和变量值不作为URL的一部分被传送,而是放在实际的HTTP请求消息内部被传送. 可以通过如下的代码设置POST提交方式参数: [html] view plaincopyprint? HttpURLConnecti

Java中避免表单重复提交

表单的重复提交: 没有完整的进行一次,先请求表单页面->再提交表单过程而完成数据提交 造成的根本原因: 没有完整的进行一次,先请求表单页面->再提交表单过程. 造成重复提交的现象: 由于服务器缓慢或网络延迟的原因,重复点击提交按钮. 已经提交成功,刷新成功页面(forward)(请求转发). 已经提交成功,通过回退,再次点击提交按钮 注意:回退后,刷新表单页面,重新再提交,这时,不是重复提交,而是发送新的请求,在Firefox下,重复提交到同一个地址的操作无效. 案例: 1 @WebServl

JAVA–利用Filter和session防止页面重复提交

JAVA–利用Filter和session防止页面重复提交解决思路:1 用户访问表单页面,先经过过滤器,过滤器设置一个随机id作为token令牌, 并将该token放入表单隐藏域中.2 表单响应到浏览器,用户填充数据后提交请求;3 请求经过过滤器,过滤器获取表单中的令牌进行验证,如果和之前生成的令牌一致,则将请求放行,并且清空令牌;4 如果用户重复提交表单,请求经过过滤器,过滤器进行验证.因为第一次放行后令牌已经清空失效,令牌不一致,不放行.跳转到提醒界面. 需用知识:1 过滤器基础知识2 se

8种方案解决重复提交问题

1.什么是幂等 在我们编程中常见幂等 select查询天然幂等 delete删除也是幂等,删除同一个多次效果一样 update直接更新某个值的,幂等 update更新累加操作的,非幂等 insert非幂等操作,每次新增一条 2.产生原因 由于重复点击或者网络重发 eg: 点击提交按钮两次; 点击刷新按钮; 使用浏览器后退按钮重复之前的操作,导致重复提交表单; 使用浏览器历史记录重复提交表单; 浏览器重复的HTTP请; nginx重发等情况; 分布式RPC的try重发等; 3.解决方案 1)前端j

解决表单重复提交

为什么会出现表单重复提交问题 1.网络延迟的情况下用户多次点击提交按钮导致表单重复提交: 2.用户提交表单时,点击浏览器[刷新]按钮导致表单重复提交,就是把浏览器上次做的事情再做一次: 3.用户提交表单后,点击浏览器[后退]按钮回退到表单页面后进行再次提交: 表单重复提交会导致的问题 能够造成很多脏数据: 解决办法 前端解决方法:只能提交一次,监控表单的提交事件,通过boolean类型的变量来区分已经点击过一次还是没有点击,如果已经点击过一次,表单就不提交,如果没有提交,表单则会提交. 后端解决

struts1与struts2的防止表单重复提交

struts1的防止表单重复提交 一.方法:利用令牌来解决页面重复提交的问题 二.步骤 2.1  Action中需要添加以下代码 public ActionForward entry(ActionMapping mapping, ActionForm form, HttpServletRequestrequest, HttpServletResponse response) throws Exception { saveToken(request); return mapping.findFor

spring boot 重复提交

package com.future.interceptor; import javax.servlet.http.HttpServletRequest; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.slf4j.Logger; import org.slf4j

[原创]java WEB学习笔记34:Session 案例 之 解决表单重复提交

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------