Servlet、SPringMVC、Struts等防止表单反复提交的多种处理方法
第一种处理方法(非拦截器):
眼下这样的方法不建议,由于JSP规范不建议写JAVA代码。这样的能够方便另外一种处理方法的理解,另外一种方法引入拦截器的思想,原理基本一样,模仿Struts的Token机制。
1、在须要防止反复的jsp中添�以下的java代码,
<%@page import="java.util.Random"%>
<%@page import="java.util.Set"%>
<%@page import="java.util.HashSet"%>
<%
//生成一个Token,算法能够自己定,不随便反复就能够了
Random ran = new Random();
String formhash = String.valueOf(ran.nextInt());
//读取当前session里面的hashCode集合,此处使用了Set,方便推断。
Set<String> token= (Set<String>) session.getAttribute("token");
if (token== null) {
token = new HashSet<String>();
}
// 检測反复问题
while (token.contains(formhash)) {
formhash = String.valueOf(ran.nextInt());
}
// 保存到session里面
token.add(formhash);
// 保存
session.setAttribute("token", token);
%>
2、
from表单中添�隐藏域
<input type="hidden" name="formhash" id="formhash" value="<%=formhash%>" />
3、后台代码 推断是否反复提交
Map<String,String> map = new HashMap<String,String>();
// 拿到表单的formhash
String formhash = request.getParameter("formhash");
// 拿到session里面的集合
Set<String> token= (Set<String>) request.getSession().getAttribute("token");
// 假设没有,则是反复提交,或者非法提交
if (token== null || !token.contains(formhash)) {
map.put("flag", "false");
map.put("message", "已经提交成功,请勿反复提交!");
return map;
} // 最后,假设操作成功,从session里面把这个formhash 删掉!
token.remove(formhash);
request.getSession().setAttribute("token", token);
假设反复提交了,直接return错误信息给页面就可以。
另外一种处理方法(拦截器):
假设用过Struts2的,能够參考Struts2的Token相关机制就可以。以下的实现是SpringMVC/SPring/Mybatis项目中实现的方法。(代码稍后整理贴出)
Servlet、SPringMVC、Struts等防止表单反复提交的多种处理方法的更多相关文章
- Struts2复习(四)防止表单反复提交
1.採取请求转发的方式完毕表单内容的加入会造成内容的反复插入. 2.採取重定向的方式实现数据的加入不会导致数据的反复插入. 3.防止表单反复提交的两种方式 1) 通过重定向 2) 通过Sessi ...
- 使用Struts 2防止表单重复提交
用户重复提交表单在某些场合将会造成非常严重的后果.例如,在使用信用卡进行在线支付的时候,如果服务器的响应速度太慢,用户有可能会多次点击提交按钮,而这可能导致那张信用卡上的金额被消费了多次.因此,重复提 ...
- [转]使用Struts 2防止表单重复提交
转自 用户重复提交表单在某些场合将会造成非常严重的后果.例如,在使用信用卡进行在线支付的时候,如果服务器的响应速度太慢,用户有可能会多次点击提交按钮,而这可能导致那张信用卡上的金额被消费了多次.因此, ...
- java防止表单重复提交的几种方法
转载大神 1. 使用session同步和token机制来防止并发重复提交 https://blog.csdn.net/hejingyuan6/article/details/50487777 2. S ...
- 161116、springmvc自己实现防止表单重复提交(基于注解)
原理:在去某个页面直接生成一个随机数(这里使用的是UUID)并放入session中,用户提交表单时将这个随机数传入服务端与session中的值进行比较,如果不不存在或不相等,则认为是重复提交:如果相等 ...
- [PHP]防止表单重复提交的几种方法
--------------------------------------------------------------------------------------------------- ...
- js防止表单重复提交的两种方法
第一种:用flag标识,下面的代码设置checkSubmitFlg标志: 复制代码代码如下: <script language=""javascript"" ...
- Jquery构建Form表单Post提交数据的简单方法
$.extend({ PostSubmitForm: function (url, args) { var body = $(document.body), form = $("<fo ...
- JavaWeb使用Session防止表单重复提交
在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 1.什么是表单 ...
随机推荐
- Struts学习之类型转换
* 从页面中获取对应的内容 * 在动作类action中,声明与页面中表单name属性的值同名的属性 * 提供get和set方法 * struts2框架就会通过 ...
- Node爬虫
Node爬虫 参考 http://www.cnblogs.com/edwardstudy/p/4133421.html 所谓的爬虫就是发送请求,并将响应的数据做一些处理 只不过不用浏览器来发送请求 需 ...
- 怎样从一个DLL中导出一个C++类
原文作者:Alex Blekhman 翻译:朱金灿 原文来源: http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx 译 ...
- req.body取不到值的问题;
随着express升级,bodyParser从express中被分离了出来,因此,在使用express新版本的时候,需要npm install body-parser 来安装bodyParser. 在 ...
- tree(简单并差集)
tree Accepts: 156 Submissions: 807 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65 ...
- Android二维码开源项目zxing用例简化和生成二维码、条形码
上一篇讲到:Android二维码开源项目zxing编译,编译出来后有一个自带的測试程序:CaptureActivity比較复杂,我仅仅要是把一些不用的东西去掉,用看起来更方便,二维码和条形码的流行性自 ...
- IOS学习之蓝牙4.0 BLE
IOS学习也一段时间了,该上点干货了.前段时间研究了一下IOS蓝牙通讯相关的东西,把研究的一个成果给大家分享一下. 一 项目背景 简单介绍一下做的东西,设备是一个金融刷卡器,通过蓝牙与iphone手机 ...
- SMACSS:一个关于CSS的最佳实践-3.Layout Rules
本篇笔者要介绍的是Layout Rules.看完本篇,大家将会知道Layout Rules的作用,以及哪些CSS应该归类为Layout Rules. 什么是Layout Rules? Layout R ...
- HDU - 1116 Play on Words(欧拉图)
有向图是否具有欧拉通路或回路的判定: 欧拉通路:图连通:除2个端点外其余节点入度=出度:1个端点入度比出度大1:一个端点入度比出度小1 或 所有节点入度等于出度 欧拉回路:图连通:所有节点入度等于出度 ...
- .net 更改日期格式
示例:更改日期格式 下面的代码示例使用 Regex.Replace 方法将 mm/dd/yy 格式的日期替换为 dd-mm-yy 格式的日期. static string MDYToDMY(strin ...