Web应用中重复提交的问题的三种解决方案
前两种是利用javascript,后面一种是在使用Struts的情况下的参考实现
1 javascript ,设置一个变量,只允许提交一次。
<script language="javascript">
var checkSubmitFlg = false;
function checkSubmit() {
if (checkSubmitFlg == true) {
return false;
}
checkSubmitFlg = true;
return true;
}
document.ondblclick = function docondblclick() {
window.event.returnValue = false;
}
document.onclick = function doconclick() {
if (checkSubmitFlg) {
window.event.returnValue = false;
}
}
</script>
<html:form action="myAction.do" method="post" onsubmit="return checkSubmit();">
2 还是javascript,将提交按钮或者image置为disable
<html:form action="myAction.do" method="post"
onsubmit="getElById('submitInput').disabled = true; return true;">
<html:image styleId="submitInput" src="images/ok_b.gif" border="0" />
</html:form>
3 利用struts的同步令牌机制
利用同步令牌(Token)机制来解决Web应用中重复提交的问题,Struts也给出了一个参考实现。
基本原理:
服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,
看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给
客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次
提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。
if (isTokenValid(request, true)) {
// your code here
return mapping.findForward("success");
} else {
saveToken(request);
return mapping.findForward("submitagain");
}
Struts根据用户会话ID和当前系统时间来生成一个唯一(对于每个会话)令牌的,具体实现可以参考
TokenProcessor类中的generateToken()方法。
1. //验证事务控制令牌,<html:form >会自动根据session中标识生成一个隐含input代表令牌,防止两次提交
2. 在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中的令牌
3. 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);
}
}
- 大小: 67.9 KB
分享到:
相关推荐
重复提交问题是指在Web应用程序中,当用户提交表单时,可能会导致重复提交,导致数据不一致和其他问题。为了解决这个问题,我们可以使用多种方法,包括前端JS提交禁止按钮、Post/Redirect/Get模式、Session中存放...
本文将深入探讨Struts2防止重复提交的解决方案,包括拦截器的配置、重复提交的原因以及`token`机制的工作原理。 首先,了解Struts2拦截器的基础知识是至关重要的。在Struts2框架中,拦截器是基于AOP(面向切面编程...
在Web应用中,避免表单的重复提交是一个棘手的问题。用户在提交表单时可能因为网络速度的原因,或者网页被恶意刷新,导致同一条记录重复插入到数据库中。这篇文章将探讨如何从客户端和服务器端一起着手,设法避免...
JSP 避免 Form 重复提交的三种方案是指在 Web 应用程序中,用户在提交 Form 后,如何防止用户不小心或恶意地重复提交表单数据,避免对服务器端和数据库造成不必要的负载和影响。下面是三种常见的解决方案: 一、...
在Web开发中,表单重复提交是一个常见的问题,可能导致数据不一致或服务器资源浪费。Servlet、Struts和SpringMVC是Java Web开发中常用的三大框架,它们各自提供了处理这一问题的策略。以下将详细探讨这三种框架如何...
在Web应用程序开发中,尤其是在使用Java Server Pages (JSP)技术时,一个常见的问题是重复提交数据。当用户不小心刷新了页面或按下了浏览器的“后退”按钮时,可能会导致同一份数据被提交多次,从而对数据库造成不必...
Struts框架是Java Web开发中常用的MVC框架之一,它为开发者提供了强大的控制层解决方案。然而,Struts框架在处理HTTP请求时,如果没有适当的防护措施,可能会遇到重复提交的问题,这可能导致数据不一致或者服务器...
基于 SpringBoot 实现表单重复提交解决方案 表单重复提交是指在一次请求完成之前防止重复提交,解决表单重复提交有多种形式,以下以 Aop+自定义注解+Redis 为例来介绍。 解决方案的详细流程 1. 当页面加载时,...
总的来说,防止用户多次重复提交是一个多维度的解决方案,需要前端、后端和数据库共同协作。前端通过禁用按钮防止用户快速点击,后端通过session或token机制确保请求的独特性,数据库则作为最后一道防线,确保数据的...
在Web应用程序开发中,特别是在使用ASP.NET进行网站构建时,一个常见的问题是表单重复提交。这通常发生在用户通过按下浏览器的F5键来刷新页面的情况下,此时之前的表单数据会被再次提交到服务器端。这不仅可能导致...
防止Struts中的重复提交是Web应用开发中的重要环节,通过合理运用Token机制、OWSM或者自定义控制器验证,可以有效地避免此类问题。在实际开发中,我们需要结合项目的具体需求,选择合适的防重复提交策略,以确保系统...
在Web应用程序开发中,一个常见的问题是如何有效地防止表单的重复提交。这不仅能够提高用户体验,还能增强系统的安全性。Struts2作为一款广泛使用的Java Web应用框架,提供了多种方式来解决这一问题。 #### 二、...
通过以上分析,我们可以看出在Web应用开发中,合理地设计和实现表单提交机制以及有效地防止重复提交是非常重要的。Struts框架提供了一套完整的解决方案,使得开发者能够更加方便快捷地实现这一功能。当然,在实际...
在ASP.NET web应用程序中,"刷新重复提交"是一个常见的问题,它发生在用户点击浏览器的刷新按钮或者使用前进/后退导航时。这可能导致数据的不一致性和错误,因为服务器可能会收到相同请求的多次处理,而这些请求原本...
为了解决这一问题,我们可以采用自定义注解结合Redis来实现一个防止表单重复提交的解决方案。 首先,让我们理解自定义注解的核心思想。注解是一种元数据,它提供了在代码中添加信息的方式,这些信息可以被编译器或...
在网页应用中,用户可能会因误操作...结合自定义拦截器,我们可以创建一个健壮的防重复提交系统,适应各种复杂的Web应用场景。同时,这种解决方案也适用于其他编程语言和框架,只要它们支持类似的功能注解和拦截机制。
在Web应用程序中,特别是在使用Java进行后端开发时,重复提交问题是常见的技术挑战之一。例如,在用户提交表单后,由于网络延迟或其他原因导致用户多次点击提交按钮或浏览器缓存导致页面刷新时,可能会出现数据的...
通过以上介绍可以看出,无论是使用Struts框架还是其他框架,利用Token机制都能有效地解决Web应用程序中表单重复提交的问题。关键是正确地生成、验证和清理Token,确保每个请求都是有效的且不被重复使用。这种方法...