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);
}
}
分享到:
相关推荐
这种方法可以防止跨站请求伪造(CSRF)攻击,同时也可防止重复提交。 4. **Session存储状态** 另一种方法是利用session存储用户的提交状态。当表单被提交后,将一个标识符存入session,然后在处理请求时检查这个...
### JSP重复提交问题及其解决方法 #### 一、引言 在Web应用程序开发中,尤其是在使用Java Server Pages (JSP)技术时,一个常见...在实际应用中,结合多种方法可以更有效地防止重复提交,提高系统的健壮性和用户体验。
本文将深入探讨自定义标签在防止重复提交中的实现原理和应用。 首先,我们要理解什么是自定义标签(Custom Tags)。在JavaServer Pages(JSP)中,自定义标签是扩展JSP功能的一种方式,它可以封装复杂的业务逻辑...
1 javascript ,设置一个变量,只允许提交一次。 [removed] var checksubmitflg = false; function checksubmit() { if (checksubmitflg == true) { return false; } checksubmitflg = true; return true; } ...
拦截器防止重复提交的设置步骤 在 Struts2 框架中,防止重复提交是一个非常重要的安全性问题。重复提交可能会导致数据的不一致和系统的不稳定。为了解决这个问题,Struts2 提供了拦截器机制来防止重复提交。在本文...
jsp防止重复提交 这做最好结合让jsp页面过期一起用。当用户返回到上一表单页面时(按backspase键、返回按钮,右击--返回),让表单页面过期。这样才可以让用户主动的刷新jsp而从新生成一个session.setAttribute(...
在Struts的配置文件(例如`struts.xml`)中,为需要防止重复提交的Action添加一个拦截器栈,包括`token`和`tokenSession`拦截器。 ```xml <!-- 配置错误结果页面 --> <param name="includeParams">none ...
在Java服务器页面(JSP)中,防止重复提交是一个重要的考虑因素,因为它可能导致数据不一致性和其他业务逻辑问题。重复提交通常发生在用户由于网络延迟或误操作而多次点击提交按钮时。以下是一些关于如何在JSP中实现...
本篇文章将深入探讨如何防止表单重复提交,主要关注于基于Struts2框架的解决方案。 首先,理解表单重复提交的原因。用户在点击提交按钮后,如果网络延迟或用户误操作导致页面刷新或再次点击提交,就可能发生重复...
在Web开发中,防止表单重复提交是一个常见的需求,尤其是在处理敏感数据或者执行不可逆操作时。Struts2为解决这个问题引入了Token机制,确保每个表单提交只被处理一次,避免了由于用户意外刷新页面导致的重复请求。 ...
当用户提交表单时,服务器会检查这个令牌,如果令牌有效且未被使用过,那么就允许表单处理,否则会拒绝请求,防止重复提交。 二、如何使用`s:token`标签 在Struts2中,要在表单中添加`s:token`标签,只需要在相应的...
- 使用数据库或缓存存储token,这样可以在分布式系统中更有效地防止重复提交。 总结,Spring MVC自定义防重复提交主要通过生成并校验token来实现。这个过程涉及客户端和服务器端的交互,以及可能的拦截器、自定义...
在Web开发中,防止重复提交是一项重要的任务,因为它可能导致数据的不一致性或处理逻辑的错误执行。Struts2提供了几种策略来防止表单的重复提交,确保请求的唯一性和事务的一致性。 一、令牌(Token)机制 Struts2...
在Struts2框架中,防止重复提交是一个重要的安全性考量,因为重复提交可能导致数据不一致性和资源浪费。在上述描述中,给出了三种主要方法来解决这个问题: 1) **使用 `<s:token>` 标签** Struts2 提供了一个称为 ...
// 提交后移除token,防止重复提交 } else { // 重复提交,显示错误信息... } %> ``` 以上就是关于防止JSP表单重复提交的相关知识,包括客户端和服务器端的策略,以及如何在实际项目中运用这些策略。通过这些...
总结,Struts2的tokenSession机制是JavaEE Web开发中防止重复提交的有效手段,通过生成并校验token,确保每个请求的唯一性,从而保护了业务数据的完整性。在实际项目中,我们需要正确配置和使用这个机制,以提高应用...