JSP避免Form重复提交的三种方案

1 javascript ,设置一个变量,只允许提交一次。

 1<script language="javascript">
 2
 3var checkSubmitFlg = false; 
 4
 5function checkSubmit() { 
 6
 7if (checkSubmitFlg == true) { 
 8
 9return false; 
10
11} 
12
13checkSubmitFlg = true; 
14
15return true; 
16
17} 
18
19document.ondblclick = function docondblclick() { 
20
21window.event.returnValue = false; 
22
23} 
24
25document.onclick = function doconclick() { 
26
27if (checkSubmitFlg) { 
28
29window.event.returnValue = false; 
30
31} 
32
33} 
34
35</script>
 1<html:form action="myAction.do" method="post" onsubmit="return checkSubmit();">
 2
 32 还是javascript,将提交按钮或者image置为disable 
 4
 5<html:form action="myAction.do" method="post" onsubmit="getElById('submitInput').disabled = true; return true;">
 6<html:image border="0" src="images/ok_b.gif" styleid="submitInput"></html:image>
 7</html:form>
 8
 93 利用struts的同步令牌机制 
10
11利用同步令牌(Token)机制来解决Web应用中重复提交的问题,Struts也给出了一个参考实现。 
12
13基本原理: 
14
15服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。 
16
17if (isTokenValid(request, true)) { 
18
19// your code here 
20
21return mapping.findForward("success"); 
22
23} else { 
24
25saveToken(request); 
26
27return mapping.findForward("submitagain"); 
28
29} 
30
31Struts根据用户会话ID和当前系统时间来生成一个唯一(对于每个会话)令牌的,具体实现可以参考TokenProcessor类中的generateToken()方法。 
32
331\. //验证事务控制令牌,<html:form>会自动根据session中标识生成一个隐含input代表令牌,防止两次提交 
34
352\. 在action中: 
36
37//<input name="org.apache.struts.taglib.html.TOKEN" type="hidden" value="6aa35341f25184fd996c4c918255c3ae"/>
38
39if (!isTokenValid(request)) 
40
41errors.add(ActionErrors.GLOBAL_ERROR, 
42
43new ActionError("error.transaction.token")); 
44
45resetToken(request); //删除session中的令牌 
46
473\. action有这样的一个方法生成令牌 
48
49protected String generateToken(HttpServletRequest request) { 
50
51HttpSession session = request.getSession(); 
52
53try { 
54
55byte id[] = session.getId().getBytes(); 
56
57byte now[] = 
58
59new Long(System.currentTimeMillis()).toString().getBytes(); 
60
61MessageDigest md = MessageDigest.getInstance("MD5"); 
62
63md.update(id); 
64
65md.update(now); 
66
67return (toHex(md.digest())); 
68
69} catch (IllegalStateException e) { 
70
71return (null); 
72
73} catch (NoSuchAlgorithmException e) { 
74
75return (null); 
76
77} 
78
79}</html:form></html:form>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus