1、表单页面初始化前,先在session存入一个token值,随后把token存放在表单页面隐藏表单域内,开始初始化;

  在表单页初始化前,调用ajax请求,在后台生成token,并返回至表单页

 function generateTokenId(){
var url =appPath+'/page/placeOrder/order/generateTokenId';
doAjax({
url : url,
type : 'post',
async : false,
success : function(data) {
$("#tokenId").val(data);
}
});
}
 @RequestMapping(value = "/order/generateTokenId")
@ResponseBody
public String initCreateOrder(HttpServletRequest request){
String uuid = UUID.randomUUID().toString();
HttpSession session = request.getSession();
session.setAttribute("UUID", uuid);
return uuid;
}
 <!-- 提交按钮 -->
<div style="width:700px;margin-top: 5px;text-align: center">
<input type="hidden" id="tokenId" />
<a class="easyui-linkbutton" href="javascript:void(0)" iconCls="icon-ok" onclick="doCreateOrder()">提交订单</a>
&nbsp;&nbsp;&nbsp;&nbsp;
<a class="easyui-linkbutton" href="javascript:void(0)" iconCls="icon-cancel" onclick="closeTab()">取消下单</a>
</div>

2、提交表单时,把隐藏表单域内token作为参数传到后台,与从session取出的token对比,若比对成功,则进行后续操作,且移除session中的token值;否则,算作重复提交,直接返回。

  比对

 public synchronized Map<String, Object> createOrder(HttpServletRequest request, OrderInfo orderInfo) {
boolean flag = this.isResubmit(request, orderInfo);
Map<String, Object> resuMap = new HashMap<String, Object>();
if (flag) {
request.getSession().removeAttribute("UUID");//验证成功,及时移除 try {
String result = doCreateOrder(orderInfo);
if(result=='ok'){
//继续后续操作
}else{
String uuid = initCreateOrder(request);//token重置
resuMap.put("tokenId",uuid);
} } catch (Exception e) {
}
}
}
 private boolean isResubmit(HttpServletRequest request, OrderInfo orderInfo){
boolean flag = false;
String uuid=null;
if (null!=request.getSession().getAttribute("UUID")) {
uuid = request.getSession().getAttribute("UUID").toString();
}
String timeId = orderInfo.getTimeId();//timeId即为tokenId
if (null!=timeId && timeId.equals(uuid)) {
flag = true;
}
return flag;
}

3、若后续操作中有些是对表单的验证,且验证通不过,表单不提交,停留在当前页,则需要重置session中token值,并且把新的token传入到表单页面隐藏表单域中(一般是ajax返回),否则表单内的值被会清空。

  if(result=='ok'){
//继续后续操作
}else{
String uuid = initCreateOrder(request);
resuMap.put("tokenId",uuid);
}
 @RequestMapping(value = "/order/generateTokenId")
@ResponseBody
public String initCreateOrder(HttpServletRequest request){
String uuid = UUID.randomUUID().toString();
HttpSession session = request.getSession();
session.setAttribute("UUID", uuid);
return uuid;
}

session token防表单重提的更多相关文章

  1. JavaWeb -- Struts1 使用示例: 表单校验 防表单重复提交 表单数据封装到实体

    1. struts 工作流程图 超链接 2. 入门案例 struts入门案例: 1.写一个注册页面,把请求交给 struts处理 <form action="${pageContext ...

  2. AOP+Token防止表单重复提交

    表单重复提交: 由于用户误操作,多次点击表单提交按钮 由于网速等原因造成页面卡顿,用户重复刷新提交页面 避免表单重复提交的方式: 1.页面上的按钮做防重复点击操作 2.在数据库中可以做唯一约束 3.利 ...

  3. PHP生成token防止表单重复提交

    .提交按钮置disabled 当用户提交后,立即把按钮置为不可用状态.这种用js来实现. 提交前代码如下: $()  {  $exec="insert into student (user_ ...

  4. php通过token验证表单重复提交

    PHP防止重复提交表单 2016-11-08 轻松学PHP 我们提交表单的时候,不能忽视的一个限制是防止用户重复提交表单,因为有可能用户连续点击了提交按钮或者是攻击者恶意提交数据,那么我们在提交数据后 ...

  5. JavaWeb学习总结(十一):Session解决form表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  6. PHP简单利用token防止表单重复提交

    <?php /* * PHP简单利用token防止表单重复提交 * 此处理方法纯粹是为了给初学者参考 */ session_start(); function set_token() { $_S ...

  7. PHP简单利用token防止表单重复提交(转)

    <?php/* * PHP简单利用token防止表单重复提交 */function set_token() { $_SESSION['token'] = md5(microtime(true)) ...

  8. ASP.NET MVC中使用Session来保持表单的状态

    本篇实践在ASP.NET MVC 4下使用Session来保持表单的状态. 本篇的源码在这里: https://github.com/darrenji/KeepFormStateUsingSessio ...

  9. Django 11 form表单(状态保持session、form表单及注册实现)

    Django 11 form表单(状态保持session.form表单及注册实现) 一.状态保持 session 状态保持 #1.http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状 ...

随机推荐

  1. 第五章 二叉树(a)树

  2. 64位windows+32位JDK8+32位eclipse是可以的

  3. 4sum, 4sum closest

    4sum [抄题]: [思维问题]: 以为很复杂,其实是“排序+双指针”的最高阶模板 [一句话思路]: [输入量特别大怎么办]: [画图]: [一刷]: 先排序! if (i > 0 & ...

  4. 11-st跳舞消耗体力最少

    /*                                                   炫舞家 ST 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述   ...

  5. SVN:项目管理工具

    svn:项目管理工具. 我们在进行团队开发的时候,每个人负责不同的层,比如:A负责DAO层,B负责SERVICE层,C负责DOMAIN层.我们开发完了自己管理的各层后需要将各层整合在一起,肯定不是拿U ...

  6. meterpreter 如何留后门,使攻击持久化

    安装后门方法一:meterpreter >run persistence -X -i 5 -p 443 -r 192.168.0.108 Persistent agent script is 6 ...

  7. 757A Gotta Catch Em' All!

    A. Gotta Catch Em' All! time limit per test 1 second memory limit per test 256 megabytes input stand ...

  8. 全基因组测序 从头测序(de novo sequencing) 重测序(re-sequencing)

    全基因组测序 全基因组测序分为从头测序(de novo sequencing)和重测序(re-sequencing). 从头测序(de novo)不需要任何参考基因组信息即可对某个物种的基因组进行测序 ...

  9. 结构体的sort【防止遗忘w】

    #include<iostream> #include<algorithm> using namespace std; int n; struct jie { int num; ...

  10. URL编码转换函数:escape()、encodeURI()、encodeURIComponent()

          函数出现时间:                      escape()                                javascript 1.0           ...