session token防表单重提
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>
<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防表单重提的更多相关文章
- JavaWeb -- Struts1 使用示例: 表单校验 防表单重复提交 表单数据封装到实体
1. struts 工作流程图 超链接 2. 入门案例 struts入门案例: 1.写一个注册页面,把请求交给 struts处理 <form action="${pageContext ...
- AOP+Token防止表单重复提交
表单重复提交: 由于用户误操作,多次点击表单提交按钮 由于网速等原因造成页面卡顿,用户重复刷新提交页面 避免表单重复提交的方式: 1.页面上的按钮做防重复点击操作 2.在数据库中可以做唯一约束 3.利 ...
- PHP生成token防止表单重复提交
.提交按钮置disabled 当用户提交后,立即把按钮置为不可用状态.这种用js来实现. 提交前代码如下: $() { $exec="insert into student (user_ ...
- php通过token验证表单重复提交
PHP防止重复提交表单 2016-11-08 轻松学PHP 我们提交表单的时候,不能忽视的一个限制是防止用户重复提交表单,因为有可能用户连续点击了提交按钮或者是攻击者恶意提交数据,那么我们在提交数据后 ...
- JavaWeb学习总结(十一):Session解决form表单重复提交
在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...
- PHP简单利用token防止表单重复提交
<?php /* * PHP简单利用token防止表单重复提交 * 此处理方法纯粹是为了给初学者参考 */ session_start(); function set_token() { $_S ...
- PHP简单利用token防止表单重复提交(转)
<?php/* * PHP简单利用token防止表单重复提交 */function set_token() { $_SESSION['token'] = md5(microtime(true)) ...
- ASP.NET MVC中使用Session来保持表单的状态
本篇实践在ASP.NET MVC 4下使用Session来保持表单的状态. 本篇的源码在这里: https://github.com/darrenji/KeepFormStateUsingSessio ...
- Django 11 form表单(状态保持session、form表单及注册实现)
Django 11 form表单(状态保持session.form表单及注册实现) 一.状态保持 session 状态保持 #1.http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状 ...
随机推荐
- jquery clone 获取文本框值得问题
1 clone 出来的文本框 默认不会把原来的事件也带过去 如果使用 $("#").clone(true); true 可以将原来的事件带过去 获取文本框的值 可以使用事件 ...
- linux 常用find
磁盘查找文件内容: find .|xargs grep x find . -exec grep x{} \; 磁盘查找文件名称: find / -name "httpd.conf" ...
- SpringMVC 文件上传 MultipartFile
本的SpringMVC的搭建在我的上一篇文章里已经写过了,这篇文章主要说明一下如何使用SpringMVC进行表单上的文件上传以及多个文件同时上传的步骤 SpringMVC 基础教程 框架分析:http ...
- MySQL语句相关
一.增加 1.基本 2.集合 3.组合 二.删除 1.基本 2.集合 3.组合 1.一个表的查询结果作为另一个表的插入字段之一 <insert id="方法" paramet ...
- 开始一个Android的appium实例
1.查看Android的应用包名和activity的方法 (网上有很多种方法,这里应用的是查看日志的方法) CMD中输入>adb logcat -c ...
- oracle改变表中列的编码
ALTER TABLE table_name CHANGE `name` `name` VARCHAR(255) CHARACTER SET utf8;
- 在Linux下配置jdk的环境变量
jdk下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 在根目录新建s ...
- 设置网站默认用IE7打开
head中加入以下内容 <meta http-equiv="X-UA-Compatible" content="IE=7" />
- swift - 画图 - 画矩形,虚线,圆和半圆
import UIKit class JYJYBouncedCouponsViewCellBgView: UIView { //一定要在这里设置 背景色, 不要再draw里面设置, override ...
- 766A Mahmoud and Longest Uncommon Subsequence
A. Mahmoud and Longest Uncommon Subsequence time limit per test 2 seconds memory limit per test 256 ...