- 浏览: 602573 次
- 性别:
- 来自: 杭州,长沙
文章分类
- 全部博客 (279)
- Java (30)
- Jsp、Servlet (18)
- Web前端 (56)
- Oracle (31)
- SqlServer (1)
- Jetty (3)
- Tomcat (6)
- Weblogic (11)
- Websphere (2)
- Struts2 (13)
- Spring (5)
- Ibatis (8)
- Hibernate (3)
- Webservice (1)
- C/C++ (2)
- Linux (13)
- Android (1)
- 正则表达式 (3)
- 网络组建 (3)
- 软件工程 (11)
- IDE使用技巧 (20)
- Windows操作技巧 (18)
- 养生之道 (1)
- 杂七杂八 (15)
- 心理保健 (1)
最新评论
-
50854319:
elements[i] = tagArr[i]; 这个需要修改 ...
document.getElementsByName在IE下的bug解决 -
mengsina:
通过楼主的介绍,能够启动client了。但是又遇到了cisco ...
(转)Cisco Systems, Inc. VPN使用过程中常见问题解决方案 -
zzz_robinson:
谢谢,关闭-启动-启动。这个循序对的,否则每次都提示服务没打开 ...
(转)Cisco Systems, Inc. VPN使用过程中常见问题解决方案 -
wuchunjiesp:
总算解决了,THANK楼主,空值问题是TYPE里面参数类型定义 ...
(原创)Ibatis2调用数据库存储过程的相关示例 -
wuchunjiesp:
存储里面是这样的
FOR I IN 1..P_GOODSDI ...
(原创)Ibatis2调用数据库存储过程的相关示例
预期达到目标:
1、当用户进行的是Refresh/Reload/Back/Forward操作、以及先Back再Submit操作时,仅仅是reloading先前的结果页。
2、当用户重复提交同一个任务操作时,后台服务接收并处理第一次提交的任务,后面提交不起作用(不转向也不提示)。
3、该功能具有公用性。
基本形成思路:
1、在basic filter中实现公用性
if(true){//问题1:如何确定是否为重复提交
...
chain.doFilter(request,response);
}else{
//问题2:如何实现不转向、不提示也不显示空白页
}
2、网上资料概括
a、提交表单后按钮变灰/隐藏提交按钮
b、在js里设置全局变量,提交后修改该变量的值,依据变量的值判断是否重复提交
var flag=true;
function checkForm(){
if (flag==false){
return;
}
flag=false;
document.form1.submit();
}
c、struts (webwork没有找到这个资料)
//验证事务控制令牌,<html:form >会自动根据session中标识生成一个隐含input代表令牌,防止两次提交
在action中:
//<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae">
if (!isTokenValid(request))
errors.add(ActionErrors.GLOBAL_ERROR,
new ActionError("error.transaction.token"));
resetToken(request); //删除session中的令牌
action有这样的一个方法生成令牌华
protected String generateToken(HttpServletRequest request) {
HttpSession session = request.getSession();
try {
byte id[] = session.getId().getBytes();
byte now[] =
new Long(System.currentTimeMillis()).toString().getBytes();
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(id);
md.update(now);
return (toHex(md.digest()));
} catch (IllegalStateException e) {
return (null);
} catch (NoSuchAlgorithmException e) {
return (null);
}
}
d、用户使用浏览器时,可以经常使用向后的按钮,因此就有可能重复提交一个他们已经提交过的form,这样就会带来一个重复事务处理的问题。同样,一个用户也可能在接收到一个确认的页面之前按下停止的按钮,接着再次提交同一个form。对于这些情况,我们都想跟踪并且禁止这些重复的提交,我们可以使用一个控制servlet来提供一个控制点,以解决这个问题。
同步记号(Synchronizer (or Dvu) Token)
这个策略是为了解决重复的form提交问题。一个同步的记号被设置在一个用户的Session中,并且包含在返回到客户的每一个form中。当form被提交时,form中的同步标记就和Session中的同步标记作对比。在form首次提交的时候,这两个标记应该是一样的。如果标记不一样,那么该form就会禁止提交,一个错误就会返回给用户。在用户提交一个form时,如果按下浏览器中的后退按钮并尝试重新提交同一个form时,标记就会出现不匹配的现象。
另一方面,如果两个标记值匹配,那么我们就可以确信整个流程是正确的。在这种情况下,Session中的标记值就会被修改为一个新的值,同时允许提交该form。 你也可以使用这个策略来控制对某些页面的直接访问,就好象上面资源保护中描述的一样。例如,假设一个用户将某个应用的页面A收藏到收藏夹中,而页面A只允许通过页面B和C访问。当用户直接通过收藏夹来访问页面A,这时页面的访问顺序就是不正确的,这样同步标记将处在一个不同步的状态,或者它根本就不存在。不论怎样,访问都被禁止了。 e、做一个hidden框,名字自己定,提交后得到这个值放入session,提交前判断session是否为空 解决方案: 1、后台公共类中实现前台的Form中自动生成两个hidden文本功能,一个是作page是否重复提交判断,并由系统自动附上关键值(如struts采用的方案);另一个作为button是否重复提交判断(struts中好像没有)。由后台公共类实现界面两个hidden text自动生成的好处在于公用性。 2、在basic filter中根据两个hidden text值判断是否为重复提交。 3、javascript中作一个公共方法,实现功能:如果需要判断是否重复提交,就给第二个hidden text附上关键值,并使该功能不可用。 . 个人感想:我相信未来该功能一定会被服务器集成,而不再由开发人员进行编码.
----------------------------------------示例代码----------------------------------------------------
第一,对于不支持POST的,可以简单的使用如下代码
if ("POST".equals(request.getMethod())) ...{
// 正常进行
}else...{
// 异常请求
out.print("异常访问");
return;
}
如果是servlet, 可以将doGet方法直接返回,不进行处理就行了
public void doGet(HttpServletRequest request, HttpServletResponse response) ...{
return;
}
public void doPost(HttpServletRequest request, HttpServletResponse response) ...{
// 正常进行操作
}
还可以采用特定的标志来区分,比如
<form><input type="hidden" name="action" value="insert"/></form>
程序里这样判断
if ("POST".equals(request.getMethod()) && ("insert".equals(request.getParameter("action")))) ...{
// 正常进行
}else...{
// 异常请求
out.print("异常访问");
return;
}
第二,判断提交的来源referer,代码如下
if ("POST".equals(request.getMethod())) ...{
String referer = request.getHeader("referer");
if (referer == null || !referer.startsWith("http://"+request.getServerName())) ...{
// 非法来源
return;
}
// 正常进行
}else...{
// 异常请求
out.print("异常访问");
return;
}
第三 防止重复提交的hashCode
在表单显示页面
//生成一个formhash,算法可以自己定,不随便重复就可以了
String formhash = MD5.encode(Long.toString(new Date().getTime()));
//读取当前session里面的hashCode集合,此处使用了Set,方便判断。
Set<String> formhashSession = (Set<String>) session.getAttribute("formhashSession");
if (formhashSession == null) ...{
formhashSession = new HashSet<String>();
}
// 检测重复问题
while (formhashSession.contains(formhash)) ...{
formhash = MD5.encode(Long.toString(new Date().getTime()));
}
// 保存到session里面
formhashSession.add(formhash);
// 保存
session.setAttribute("formhashSession", formhashSession);
表单里面增加如下字段
<input type="hidden" name="formhash" id="formhash" value="<%=formhash%>" />
在表单提交页面进行如下处理
// 拿到表单的formhash
String formhash = upload.getParameter("formhash");
// 拿到session里面的集合
Set<String> formhashSession = (Set<String>) session.getAttribute("formhashSession");
// 如果没有,则是重复提交,或者非法提交
if (formhashSession == null || !formhashSession.contains(formhash)) ...{
out.println("请不要重复提交!");
return;
}
// 下面进行其它的操作
//
// 最后,如果操作成功,从session里面把这个formhash 删掉!
// 以免用户少填写了某个字段,造成表单无法再次提交
formhashSession.remove(formhash);
session.setAttribute("formhashSession", formhashSession);
来源为http://blog.csdn.net/或http://www.Java2000.net
发表评论
-
Java script 看看黑客怎么写的 (转)
2013-01-19 16:54 1175在2011年的BlackHat DC 2011大会上Ryan ... -
web.xml 详解三
2009-06-23 13:44 891web.xml 详解三一旦建立了一个过滤器,可以在web.xm ... -
web.xml详解二
2009-06-23 13:43 710web.xml 详解二例如,程序清单5-7给出一个名为Init ... -
web.xml详解一
2009-06-23 13:40 946web.xml 详解一1 定义头和 ... -
Web应用中并发控制的实现
2009-04-17 09:55 1341引言 B/S构架的应用越来越普及,但由于它有别于C/S构 ... -
MIME标准介绍
2009-04-16 16:52 1491词条简介 [ 编辑本段 ... -
jsp页面缓存处理
2009-04-09 15:22 22591。在Asp页面首部<head>加入 Re ... -
FCKeditor使用示例
2009-04-09 15:21 1222示例一 一、准备工作 在http://www.fcked ... -
对Jsp中的自定义标签由浅到深详细讲解
2009-03-31 19:29 792一、基本概念: 1.标 ... -
JSP开发中的对象和范围属性
2009-03-31 19:05 814在JSP页面中的对象,包括用户创建的对象(例如,JavaBea ... -
一个实用的例子:JSP抓取网页代码的程序
2009-03-31 17:38 966< %@ page contentType=&q ... -
重复提交、重复刷新、防止后退的问题以及处理方
2009-03-28 16:15 3096一。前言你在任何一个比较专业的BBS都会看到这样的问题,即使你 ... -
EL表达式详解
2009-03-05 14:23 1527EL表达式详解 在 JSP 页面中,使用标签库代 ... -
在浏览器关闭cookie情况下进行会话管理-JSP教程,Jsp/Servlet
2008-10-25 16:09 1346如果浏览器不支持 cookies,或将浏览器设置为不接受 co ... -
JFreeChat的介绍
2007-11-16 10:07 1374一、简介 JFreeChart(http://www.jfr ... -
JSP/Servlet页面中文显示为乱码的解决方式
2008-01-03 14:05 2584经过网上搜索和自己的经验,JSP/Servlet页面的中文显示 ... -
JSP中的源代码泄漏问题
2008-08-21 11:45 1791在JSP技术得到广泛应用 ...
相关推荐
提交表单后提交禁用提交按钮,防止重复提交.
服务器端避免表单的重复提交,利用同步令牌来解决重复提交的基本原理如下:(1)用户访问提交数据的页面,服务器端在这次会话中,创建一个session对象,并产生一个令牌值,将这个令牌值作为隐藏输入域的值,随表单一起发送到...
javascript方式防止表单重复提交,
好友使用vue技术封装了一个专门用于提交表单和下载文件的“防抖按钮”,其实现原理和使用方法看这里 https://blog.csdn.net/PursueExcellence/article/details/103903139。
自定义封装注解类,(生成token存放到redis中)通过注解的方式解决API接口幂等设计防止表单重复提交
springboot2.1+redis+拦截器 防止表单重复提交详细完整介绍,所用到的文件都上传了,下载即可使用。自己花了半天整理,并且测试通过,使用在实际项目中的,希望对每一个下载的朋友有帮助。
防止重复提交java解决 B/S结构的软件开发中,特别是在越大型的分布式应用中体现的越明显,后端的处理往往会因为出现较多的时间消耗而引起延迟,这种延迟有可能过长而终使用户认为是自己的操作错误,导致他们重新...
在我们进行Java Web开发时,提交一个action处理请求后(或者提交一个表单后),进行刷新操作,或按F5键时会出现action处理重复执行的情况,数据库中会出现多条同样的记录,解决这种问题的方法有多种,但最安全有效的...
今天小编就为大家分享一篇防止Layui form表单重复提交的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
客户端防表单重复提交和服务器端session防表单重复提交.
主要介绍了spring boot 防止重复提交实现方法,结合实例形式详细分析了spring boot 防止重复提交具体配置、实现方法及操作注意事项,需要的朋友可以参考下
这是一个关于防止表单重复提交的练习,大神勿喷!
ASP.NET中防止刷新页面造成表单重复提交
java发起http请求提交表单
防止用户表单重复提交的完整demo 分别在js与后台中处理,js处理(针对网络慢情况) 后台处理(针对用户点击浏览器上的刷新按钮等)
防止表单重复提交。判断是新打开的页面还是刷新的页面 判断是新打开的页面还是刷新的页面
当用户将信息提交到服务器,服务器响应采用forward方式调转到下一个页面后,此时地址栏中显示的是上个页面的URL,若刷新当前页面,浏览器会将再次提交用户先前输入的数据,就会再次出现表单重复提交的问题。...
如何避免表单重复提交,这篇文章就为大家详细介绍了Java表单重复提交的避免方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
防止表单重复提交的方法(简单的token方式),内附实现代码及实现思路。
先说对话框(Dialog)里的表单提交 错误方案 说起错误方案,比如,点击提交按钮,本地验证,验证通过立即让按钮不可点,这些没问题,而我的错误点概括是:在某个最后执行的回调函数的最后一行,我做了2个操作:1,...