- 浏览: 153200 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (130)
- Database (5)
- JavaSE (23)
- JavaScript (11)
- Struts2 (15)
- Hibernate (11)
- Spring (16)
- Linux (4)
- Jquery (3)
- Tools (12)
- Jsp (7)
- 杂谈 (9)
- WEB Project (10)
- WebService (16)
- maven (2)
- android (1)
- memcache (2)
- 网络通信 (4)
- solr (1)
- cxf (7)
- powerdesigner (1)
- jxls (1)
- springmvc (1)
- nosql (1)
- node.js (0)
- thrift (0)
- REST (1)
- tag (1)
最新评论
1 由于服务器缓慢或者网络延迟的原因,重复点击提交按钮
2 已经提交成功,但是还不停刷新成功页面
3 已经提交成功,通过回退,再次点击提交按钮。
这些情况都可能使数据库中产生过多相同的冗余数据,浪费数据库资源。只有转发才会出现,重定向则不会。
针对第一种情况的解决方案(使用JavaScript),对后面两种无效:
首先在页面中添加如下格式的JavaScript代码
<script type="text/javascript">
var submitFlag=false;
function checksubmit(){
if(!submitFlag){
submitFlag=true;
document.forms[0].submit();
}
}
</script>
(1)当提交按钮的type属性为button时:
设置按钮的onClick=”checksubmit();”即可。
(2)当提交按钮的type属性为submit时:
设
置按钮的onClick=”checksubmit();”,并在<form>标签中增加onsubmit=”return
false”。因为submit按钮的自动提交时在点击事件提交之后,将onsubmit设置为”return
false”,submit按钮的自动提交就会失效。
对于后面两种情况,可以使用session解决,其原理是在运行添加信息页面时在
session中放置信息,然后页面提交信息给servlet处理,servlet获取session中的信息,如果session中有信息不为空则将信
息插入数据库,然后删除session中的信息,下次再提交表单时session中的信息为空,那么则不执行存储信息过程。
但是单纯使用session有其局限性,所以在实际开发中,一般使用利用session结合UUID解决表单的重复提交,代码如下:
定义一个UuidToken类
public class UuidToken {
private static UuidToken UuidToken=new UuidToken();
private UuidToken(){
}
public static UuidToken getUuidToken() {
return UuidToken;
}
public synchronized String getUUIDAsStr(HttpServletRequest request){
HttpSession session=request.getSession();
String uuidStr=UUID.randomUUID().toString();
if(uuidStr!=null){
session.setAttribute("session.uuid", uuidStr);
}
return uuidStr;
}
/**
* 判断session中保存的uuid和jsp页面上的uuid是否相等
*/
public synchronized boolean isUUIDValidate(HttpServletRequest request) {
//获取已存在的session
HttpSession session=request.getSession(false);
if(session==null){
return false;
}
String sessionuuid = (String)session.getAttribute ("session.uuid");
if(sessionuuid==null){
return false;
}
String htmluuid=request.getParameter("html.uuid");
if(htmluuid==null){
return false;
}
return sessionuuid.equals(htmluuid);
}
/**
* 删除uuid
*/
public synchronized void resetUUID(HttpServletRequest request) {
HttpSession session=request.getSession(false);
if(session==null){
return;
}
session.removeAttribute("session.uuid");
}
}
在jsp页面增加一个隐藏域,利用uuid生成一个唯一的标识号,赋给隐藏域,把唯一的标识号 放置到session中一份,代码如下:
<input type="hidden" name="html.uuid" value='<%=UuidToken.getUuidToken().getUUIDAsStr(request)%>'>
提交给servlet后,获取 jsp页隐藏域的值,用隐藏域的值和session中放置的值做比对,如果相同,保存数据并从session中删除UUID,不相同则说明是重复提交,不进行处理。
boolean flag= UuidToken.getUuidToken().isUUIDValidate(request);
if(flag){
// 保存信息到数据库
//从session删除uuid的
UuidToken.getUuidToken().resetUUID(request);
}else{
System.out.println("表单重复提交");
}
http://blog.csdn.net/liuxiaolei7676/article/details/5646165
发表评论
-
jsp自定义tag标签
2014-03-17 13:52 522tag标签文件 http://blog.csdn.net ... -
CXF-RESTFUL 入参是复合对象的使用方法
2012-12-18 18:31 1086java 开发CXF-RESTFUL,在服务端的入参如果比 ... -
classpath:xxx.xml 与 classpath*:xxx.xml的区别
2012-12-14 14:45 753在使用开源框架如spring、struts2等经常需要配 ... -
最新SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常见问题总结
2012-12-14 14:19 670一 开发环境 1、动态web工程 2、部分依赖 ... -
HTTP Keep-Alive详解
2012-12-07 10:15 798HTTP Keep Alive HTTP Keep-Alive ... -
关于“无状态的HTTP连接提供有状态的连接"
2012-12-07 09:58 1231HTTP是无状态链接,请求 ... -
Java编程中“为了性能”尽量要做到的一些地方
2012-07-04 14:44 6221.慎用synchronized,尽量减小synchroniz ... -
终于淘得几款很好的jquery UI 框架
2011-12-09 17:47 1261Liger UI框架 http://www.ligerui ... -
java format(MessageFormat)
2011-12-06 17:20 739java.text.Format |__java. ... -
java 主线程等待子线程执行完成后再执行
2011-12-06 09:47 3152原文:http://www.jiacheo.org/blog ... -
servlet 中获得spring Bean 的方法
2011-12-01 10:58 1079只需要servlet 中的servletCo ... -
Ognl/MVEL/Aviator/JSEL 四种表达式引擎执行效率对比
2011-11-24 10:33 2935http://jindw.iteye.com/blog/732 ... -
java模拟javascript的encodeURI方法
2011-10-27 15:52 2892import java.io.UnsupportedEncod ... -
3种下载文件程序的思考,为何使用NIO进行异步网络通讯
2011-10-08 14:37 654原文链接:http://suhuanzheng7784877 ... -
servlet 上传文件
2011-09-21 11:08 672原文:http://zhidao.baidu.com/ques ... -
cglib 动态代理
2011-08-12 10:35 711cglib is a powerful, high perfo ... -
【温故而知新】log4j输出多个自定义日志文件,动态配置路径
2011-08-10 15:38 8371. log4j输出多个自定义日志文件 log ... -
java7 新特性
2011-08-10 10:48 692原文链接:http://www.iteye ... -
一个超级无敌好用的幻灯片插件【有图有真相】
2011-08-09 15:02 714原文:http://www.1kjs.com/lib/widg ... -
【温故而知新】一个极好极全极简明的EL表达式的学习文档
2011-07-27 10:49 807本文来源:http://wenku.baidu.com/ ...
相关推荐
主要介绍了浅谈利用Session防止表单重复提交,简单介绍表单重复提交的情况,分析,以及解决方法代码示例,具有一定借鉴价值,需要的朋友可以了解下。
struts2防止表单重复提交,利用struts的拦截器tokenSession,轻轻松松解决表单重复提交的问题。 附件为源代码,后台延迟了3秒,可直接在web服务器下部署运行,输入用户名和密码后,多点几次提交按钮,然后看控制台...
服务器端避免表单的重复提交,利用同步令牌来解决重复提交的基本原理如下:(1)用户访问提交数据的页面,服务器端在这次会话中,创建一个session对象,并产生一个令牌值,将这个令牌值作为隐藏输入域的值,随表单一起发送到...
PHP防止刷新重复提交,通过不断刷新(Refresh or Reload)表单提交页面,可以重复提交表单内容,可以利用 PHP 的 Session 来避免这一点,Session 保存在服务器端,在 PHP 过程中改变 Session 变量的值后,即保存在...
38.如何利用Session防止用户重复投票 40.如何在Session对象失效后重新设置Session对象 41.如何创建、读写和删除Cookie 43.如何遍历Cookies集合 44.如何判断客户端的Cookie是否处于开启状态 45.如何使用Cookie记录...
实例031 不提交表单获取单选按钮的值 43 实例032 选中单选按钮后显示其他表单元素 44 实例033 根据数据表结构自动生成数据录入页面 45 实例034 投票系统中单选按钮与复选框的应用 47 2.3 下拉列表的应用 ...
实例172 不提交表单获取单选按钮的值 207 实例173 实现复选框中的全选、反选和不选 208 实例174 隐藏域提交用户的ID值 210 实例175 图像域替代提交按钮 211 实例176 跳转菜单实现页面跳转 213 实例177 上传图片预览 ...
实例172 不提交表单获取单选按钮的值 207 实例173 实现复选框中的全选、反选和不选 208 实例174 隐藏域提交用户的ID值 210 实例175 图像域替代提交按钮 211 实例176 跳转菜单实现页面跳转 213 实例177 上传图片预览 ...
第15章防止重复提交 252 15.1 标记管理 252 15.2 使用Token拦截器 253 15.3 使用Token Session拦截器 256 15.4 小结 257 第16章调试与性能分析 258 16.1 debug标签 258 16.2 Debugging拦截器 259 16.3 性能...
第15章 防止重复提交 252 15.1 标记管理 252 15.2 使用Token拦截器 253 15.3 使用Token Session拦截器 256 15.4 小结 257 第16章 调试与性能分析 258 16.1 debug标签 258 16.2 Debugging拦截器 259 16.3 性能分析 ...
SubmitOncePage:解决刷新页面造成的数据重复提交问题 SharpRewriter:javascript + xml技术利用#实现url重定向 采用XHTML和CSS设计可重用可换肤的WEB站点 asp.net的网址重定向方法的比较:面向搜索引擎友好 也谈 ...
8 <br>0018 有效利用Visual Studio 2005附带程序 8 <br>0019 有效使用MSDN帮助 9 <br>0020 如何设置MSDN帮助 9 <br>1.4 其他 10 <br>0021 如何添加项目引用 10 <br>0022 如何添加Web...