1:js控制 ,设置一个变量,只允许提交一次。 <script></script>
2 :还是js,将提交按钮或者image置为disable
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. //验证事务控制令牌,
会自动根据session中标识生成一个隐含input代表令牌,防止两次提交
2. 在action中:
3. action有这样的一个方法生成令牌
if (!isTokenValid(request))
errors.add(ActionErrors.GLOBAL_ERROR,
new ActionError("error.transaction.token"));
resetToken(request); //删除session中的令牌
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);
}
}
在更新的时候防止按钮重复点击,主要是用Session来做判断在JSP/Servlet中可以
SynchroToken.java
package com.moonights.util;
import org.apache.struts.util.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import org.apache.struts.action.*;
/**
*
*/
public class SynchroToken{
public final static java.lang.String TOKEN_NAME = "_token";
public static boolean checkToken (HttpServletRequest request){
boolean isEqual = false;
HttpSession session = request.getSession ();
String formToken = request.getParameter (TOKEN_NAME);
String sessionToken = (String)session.getAttribute (TOKEN_NAME);
System.out.println ("formToken: " + formToken + " sessionToken: " +
sessionToken);
if (formToken != null && sessionToken == null){
session.setAttribute (TOKEN_NAME, formToken);
isEqual = true;
}
return isEqual;
}
/**
* Insert the method's description here.
* Creation date: (4/19/2004 3:23:25 PM)
* @return java.lang.String
* @param request javax.servlet.http.HttpServletRequest
*/
public static String getToken (HttpServletRequest request){
String token = "" + System.currentTimeMillis ();
HttpSession session = request.getSession ();
if (session != null){
session.removeAttribute (TOKEN_NAME);
}
return token;z
}
/**
* Insert the method's description here.
* Creation date: (8/9/2007 21:44:30 PM)
* @return java.lang.String
*/
final static java.lang.String getTOKEN_NAME (){
return TOKEN_NAME;
}
public static String message (PageContext pageContext, String key) throws
JspException{
return RequestUtils.message (pageContext, null, null, key);
}
}
4: 添加中转页面
分享到:
相关推荐
JSP避免Form重复提交的三种方案内有详细的方案说明
JSP避免Form重复提交的三种方案.docx
JSP源码——Struts+Hibernate实现MVC_strutsmvc.zip
JSP信息办公类实例开发源码——基于struts的图书管理系统.zip
java毕业设计——jsp企业快信系统的设计与实现(论文+答辩PPT+源代码+数据库).zip java毕业设计——jsp企业快信系统的设计与实现(论文+答辩PPT+源代码+数据库).zip java毕业设计——jsp企业快信系统的设计与实现(论文...
java毕业设计——JSP企业电子投票系统的设计与实现(论文+答辩PPT+源代码+数据库).zip java毕业设计——JSP企业电子投票系统的设计与实现(论文+答辩PPT+源代码+数据库).zip java毕业设计——JSP企业电子投票系统的...
java毕业设计——jsp码头船只出行及配套货柜码放管理系统的设计与实现(论文+答辩PPT+源代码+数据库).zip java毕业设计——jsp码头船只出行及配套货柜码放管理系统的设计与实现(论文+答辩PPT+源代码+数据库).zip java...
JSP源码——jsp+servlet+javaBean实现MVC_jspmvc.zip
从零开始——JSP动态网页制作基础培训教程-源代码,包含全部的源代码,可以配合书本进行学习,适合入门级学者,或想更加了解动态网页制作知识的学者!
JSP核心技术——JSP引擎内幕(2010).pdf 内除了引擎外,还有jsp标签、线程安全
此压缩包包含学习Web程序设计——JSP 总共10章内容。
即用即查——JSP函数与对象参考手册 即用即查——JSP函数与对象参考手册
jsp毕业设计——jsp报名系统.zip
JSP源码——JSP_JTBC_CMS(SQLITE).zip
JSP_重复提交_解决方法JSP_重复提交_解决方法JSP_重复提交_解决方法
JSP源码——Jsp考试系统_jspks.zip
JAVA遇见HTML——JSP篇基本概念 初学适用