- 浏览: 46081 次
- 性别:
- 来自: 广州
文章分类
最新评论
对于JSP 入门的初级的学习者表单的提交是一个非常困扰的问题,那么如何避免Form 表单多次提交呢?可以从以下的几个方面入手:
一. 对于初学JSP 可以先通过Javascript 中设置
设置一个变量,只允许表单提交一次。
1. ﹤ script language = "javascript" ﹥
2. var checkSubmitFlg = false ;
3. function checkSubmit() {
4. if ( checkSubmitFlg == true) {
5. return false;
6. }
7. checkSubmitFlg = true ;
8. return true;
9. }
10. document.ondblclick = function docondblclick() {
11. window.event.returnValue = false ;
12. }
13. document.onclick = function doconclick() {
14. if (checkSubmitFlg) {
15. window.event.returnValue = false ;
16. }
17. }
18. ﹤ /script ﹥
19.
20. ﹤ html:form action = "myAction.do" method = "post" onsubmit = "return checkSubmit();" ﹥
二. 对于JSP 人门还要掌握Javascript 的另一设置
将表单提交按钮或者image 置为disable
21. ﹤ html:form action = "myAction.do" method = "post"
22. onsubmit = "getElById('submitInput').disabled = true; return true;" ﹥
23. ﹤ html:image styleId = "submitInput" src = "images/ok_b.gif" border = "0" / ﹥
24. ﹤ /html:form ﹥
三.
在JSP
入门阶段也要注意善于利用STRUTS
的同步令牌机制
利用同步令牌(Token
)机制来解决Web
应用中重复Form
表单提交的问题,Struts
也给出了一个参考实现。
基本原理:
服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。
25. if (isTokenValid(request, true)) {
26. // your code here
27. return mapping.findForward("success");
28. } else {
29. saveToken(request);
30. return mapping.findForward("submitagain");
31. }
STRUTS 根据用户会话ID 和当前系统时间来生成一个唯一(对于每个会话)令牌的,具体实现可以参考TokenProcessor 类中的generateToken() 方法。
1. // 验证事务控制令牌, ﹤html:form ﹥会自动根据session 中标识生成一个隐含input 代表令牌,防止两次提交
2. 在action 中:
32. // ﹤ input type = "hidden" name = "org.apache.struts.taglib.html.TOKEN"
33. // value = "6aa35341f25184fd996c4c918255c3ae" ﹥
34. if (!isTokenValid(request))
35. errors.add(ActionErrors.GLOBAL_ERROR,
36. new ActionError("error.transaction.token"));
37. resetToken(request); // 删除 session 中的令牌
3. action 有这样的一个方法生成令牌
38. protected String generateToken(HttpServletRequest request) {
39. HttpSession session = request .getSession();
40. try {
41. byte id[] = session.getId().getBytes();
42. byte now[] =
43. new Long(System.currentTimeMillis()).toString().getBytes();
44. MessageDigest md = MessageDigest .getInstance("MD5");
45. md.update(id);
46. md.update(now);
47. return (toHex(md.digest()));
48. } catch (IllegalStateException e) {
49. return (null);
50. } catch (NoSuchAlgorithmException e) {
51. return (null);
52. }
53. }
在更新的时候防止表单按钮重复点击,主要是用Session
来做判断
四. 在JSP 入门时还要掌握页面方式
54. ﹤ input type = "hidden " name = " ﹤ % =com.lims.util.SynchroToken.TOKEN_NAME% ﹥ " value = " ﹤ %= com.lims.util.SynchroToken.getToken(request)% ﹥ " ﹥
55.
56. SynchroToken.java
57. package com.lims.util;
58. import org.apache.struts.util.*;
59. import javax.servlet.http.*;
60. import javax.servlet.jsp.*;
61. import org.apache.struts.action.*;
62. /**
63. * ﹤ p ﹥ Title: SynchroToken ﹤ /p ﹥
64. * ﹤ p ﹥ Description: ﹤ /p ﹥
65. * ﹤ p ﹥ Copyright: Copyright (c) 2004 ﹤ /p ﹥
66. * ﹤ p ﹥ Company: NetStar ﹤ /p ﹥
67. * @author Jstar
68. * @version 1.0
69. * Created in 2004/04/21
70. */
71. public class SynchroToken{
72. public final static java.lang.String TOKEN_NAME = "_token" ;
73. public static boolean checkToken (HttpServletRequest request){
74. boolean isEqual = false ;
75. HttpSession session = request .getSession ();
76. String formToken = request .getParameter (TOKEN_NAME);
77. String sessionToken = (String)session.getAttribute (TOKEN_NAME);
78. System.out.println ("formToken: " + formToken + " sessionToken: " +
79. sessionToken);
80. if (formToken != null && sessionToken == null){
81. session.setAttribute (TOKEN_NAME, formToken);
82. isEqual = true ;
83. }
84. return isEqual;
85. }
86. /**
87. * Insert the method's description here.
88. * Creation date: (4/19/2004 3:23:25 PM)
89. * @return java.lang.String
90. * @param request javax.servlet.http.HttpServletRequest
91. */
92. public static String getToken (HttpServletRequest request){
93. String token = "" + System.currentTimeMillis ();
94. HttpSession session = request .getSession ();
95. if (session != null){
96. session.removeAttribute (TOKEN_NAME);
97. }
98. return token;z
99. }
100. /**
101. * Insert the method's description here.
102. * Creation date: (4/19/2004 3:24:10 PM)
103. * @return java.lang.String
104. */
105. final static java.lang.String getTOKEN_NAME (){
106. return TOKEN_NAME;
107. }
108. public static String message (PageContext pageContext, String key) throws
109. JspException{
110. return RequestUtils.message (pageContext, null, null, key);
111. }
112. }
113.
五. 也可以通过添加中转页面的方式
对于JSP 入门的角度讲,可以通过添加中转页面的方式,这样做虽然在视觉上不是很好,页面间显繁琐,但是这是有效地避免Form 表单重复提交的好方式。
发表评论
-
java web项目配置tomcat连接池
2011-09-20 23:33 1736本文包含两部分内容。第一部分是在eclipse下配置项目 ... -
javaweb中的请求--响应流程(get方式提交请求)
2011-09-11 22:30 987javaweb中的请求--响应流程(get方式提交请求) -
JSP入门需要知道的五个方面
2011-09-10 21:16 777本文是一个JSP入门的简单的总结性文章,从Servlet知 ... -
Form表单提交数据编码方式和tomcat接受数据解码方式的思考
2011-09-10 21:11 512form有2中方法把数据提 ... -
execute、executeQuery和executeUpdate之间的区别
2011-09-10 21:09 659JDBCTM中Statement接口提 ... -
使用eclipse开发J2EE应用
2011-09-10 21:08 708使用eclipse开发J2EE应用 -
web.xml文件在web项目中的作用及基本配置
2011-09-10 21:03 1880web 工程中的 web.xml 文件有什 ... -
java中文乱码解决方法
2011-09-10 20:56 7381 .以POST 方法提交 ... -
jsp实现网页计数器(防刷新计数和防刷新单用户计数)
2011-09-10 20:51 1241jsp实现网页计数器(防刷新计数和防刷新单用户计数) -
jsp分页实现
2011-09-10 20:47 582jsp分页实现 -
多图详解教程:Eclipse3.6连接Tomcat7
2011-09-10 20:44 689多图详解教程:Eclipse3.6连接Tomcat7(见附件) ... -
url 重写来实现会话管理
2011-09-08 21:45 907如果浏览器不支持 cookies,或将浏览器设置为不接受 co ... -
jsp环境下session的创建
2011-09-08 20:54 7821)-不恰当的request.getSessi ... -
跳出页面的Frame框架
2011-09-08 12:12 614如何跳出页面的Frame 框架 很多网页都是框架结构的 ... -
使用eclipse开发J2EE应用
2011-09-08 12:09 0<!-- [if !mso]> <styl ... -
web.xml 中的listener、 filter、servlet 加载顺序及其详解
2011-09-08 12:05 645一、 1、启动一个WEB项 ... -
UrlRewriter url重写
2011-09-08 12:04 767如何增强你网站中地址的可读性和让搜索引擎快速的收录到你的 ... -
TOMCAT数据库连接池的配置方法总结
2011-09-08 12:02 812以MySQL+TOMCAT 为例 1. ... -
Tomcat解决中文转码问题
2011-09-08 11:51 1841Tomcat解决中文转码问题 ... -
Tomcat与IIS整合手记
2011-09-08 11:49 966安装配置 IIS6 和 Tomcat6 ...
相关推荐
JSP避免Form重复提交的三种方案内有详细的方案说明
JSP避免Form重复提交的三种方案.docx
在一个jsp页面中,定义了一个用户登录界面(以form表单定义),但要达到检验输入的信息的合法性,就需要对输入的用户信息作判断,那么自然就需要取出其中的值。有的页面可以用action传参来得到form中输入的信息值,...
NULL 博文链接:https://feng5588feng.iteye.com/blog/1494002
jsp+servlet做的form表单各个元素的提交到后台处理再显示
SSH笔记-数据验证、上传下载、避免表单重复提交、自定义拦截器
jsp表单的FORM传值
JSP_重复提交_解决方法JSP_重复提交_解决方法JSP_重复提交_解决方法
一个Jsp两个ActionForm分别提交.rar一个Jsp两个ActionForm分别提交.rar一个Jsp两个ActionForm分别提交.rar一个Jsp两个ActionForm分别提交.rar一个Jsp两个ActionForm分别提交.rar
主要介绍了JSP针对表单重复提交的处理方法,涉及JSP基于session的重复提交判定使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
1.代码: 代码如下: <%– Document : index Created on : 2009-10-4, 13:56:46 Author : lucifer –%> <!DOCTYPE HTML PUBLIC “-//W3C//DTD ... <head> <title>... [removed] function giveFocus
转义表单提交字符处理函数,可用于php或javascript的字符处理函数列表
简单的ajaxt无刷新实现表单提交的实例(myeclipse 直接导入运行) 学习点: 1;ajax无刷新表单提交 2;ajax的运行历程 最简单明了的实例,清晰的帮你弄清上述概念,运行简单,只需解压该包,然后Myeclipse中file - ...
1.form表单中只有一个input标签,按回车键将自动提交表单 当form表单中只有一个<input type=”text” name=’name’ />时按回车键将会自动将表单提交。 <form id='form1' action='a1.jsp' method='post'>...
1.提供表单放置重复提交demo。 2.从后台到前台使用都有详细资料。
jsp+servlet+from表单提交,上传头像,写入服务器
jsp表单