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. minikube

    cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://p ...

  2. 大型运输行业实战_day10_1_自定义事务管理类

    1.创建事务管理类  TransactionManager.java package com.day02.sation.transaction; import com.day02.sation.uti ...

  3. /Library,/System/Library,~/Library

      /System/library是系统级,/ Library下面面向全部用户,~/Library 限于当前用户 一般来说,很少碰/ Library,都是用到/System/library和~/lib ...

  4. springmvc el表达式取值顺序问题

    最近遇到一个问题,两次访问同一个controler, 第二次根据判断条件,明明没有设置model的值,在jsp中通过${data}还是能取到值,最后找到原因是 我为了能够加快响应速度,在session ...

  5. joinablequeue模块 生产者消费者模型 Manager模块 进程池 管道

    一.生产者消费者 主要是为解耦(借助队列来实现生产者消费者模型) import queue  # 不能进行多进程之间的数据传输 (1)from multiprocessing import Queue ...

  6. fusioncharts 破解方法(转载)

    FusionCharts是一个Flash的图表组件,它可以用来制作数据动画图表,其中动画效果用的是Adobe Flash 8 (原Macromedia Flash的)制作的flash , Fusion ...

  7. OC 线程操作 - GCD队列组

    1.队列组两种使用方法2.队列组等待 wait /** 新方法 队列组一般用在在异步操作,在主线程写队列组毫无任何作用 */ - (void)GCD_Group_new_group___notify{ ...

  8. centos7 编译安装mysql

    centos 7 安装mySql   1,准备mySql源码安装 #wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.23.tar ...

  9. 官网类原型模板分享——Apple

    苹果公司是美国一家高科技公司,引领全球数码产品设计潮流,是世界最具价值的品牌. 此原型正是取自苹果公司官网,网站主要以展示产品为主,排版方式采用大图配简练的文字,清爽简洁的同时突出产品优势,增大产品的 ...

  10. 2017年值得一看的7个APP设计

    新媒体时代蓬勃发展,各类APP如雨后春笋般出现.下载到合适的APP,不仅衣食住行一键搞定,甚至健身.社交.阅读等需求也能足不出户地满足.对于广大“吃瓜群众”来说,选择APP是个人需求以及跟随潮流的选择 ...