`

JSP入门之避免Form表单重复提交的几种方案

    博客分类:
  • jsp
 
阅读更多

 

对于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 表单重复提交的好方式。

分享到:
评论

相关推荐

    ajax iframe jsp 无刷新上传文件.zip

    7. **请求Action的几种方式**:在JSP中,有多种方式请求Action,如使用HTML的form表单提交,s:form标签,以及通过JavaScript的Ajax调用。每种方式都有其适用场景,开发者应根据需求选择合适的请求方式。 8. **...

    JSP实现的网上报名系统

    JSP中的`<form>`标签用于创建表单,`action`属性指定处理表单的Servlet,`method`属性决定是GET还是POST方式提交。 6. **错误处理与验证**: 系统应包含对用户输入的验证,如检查必填项、格式正确性等,避免无效数据...

    在jsp中运用ajax(简单入门)

    ### 在JSP中运用AJAX(简单入门) 随着互联网技术的发展与用户对交互体验要求的提高,AJAX技术因其能够实现网页的异步更新而受到广泛欢迎。本篇文章将通过一个具体的示例来介绍如何在JSP页面中使用AJAX进行简单的...

    非常棒的jsp初学者幻灯片教程

    JSP有以下几种语法元素: 1. **指令(Directives)**:用于设置页面属性,如`<%@ page ... %>`,用于指定页面编码、导入Java包等。 2. **脚本元素(Scriptlets)**:在`<%...%>`内写入Java代码,执行服务器端逻辑。...

    jsp原始demo注册表

    `<jsp:setProperty>`设置Bean的属性,对应表单提交的数据。 5. **请求处理与响应**:当用户提交注册表单时,JSP会通过HTTP请求将数据发送到服务器。服务器端的JSP或Servlet接收请求,验证数据,然后可能返回一个...

    JSP信息系统设计与开发实例

    JavaServer Pages (简称 JSP) 是一种基于 Java 的服务器端技术,用于生成动态 Web 内容。它允许开发者将静态 HTML 和动态 Java 代码混合在一起,从而创建功能强大的 Web 应用程序。JSP 文件通常以 `.jsp` 扩展名存储...

    纯JSP资料(不带servlet)

    JavaServer Pages,简称JSP,是一种基于Java技术的网页程序设计语言,用于动态生成Web内容。JSP被设计用来简化Servlet的开发,将界面设计与业务逻辑分离,使得开发更加高效和便捷。JSP文件本质上是HTML或XML文档,但...

    javaweb快速入门

    - **表单(form)处理**: 在JavaWeb开发中,表单是非常重要的一部分,用于收集用户的输入。常见的表单元素包括: - 文本框 `<input type="text">` - 密码框 `<input type="password">` - 提交按钮 `...

    Struts1.2入门程序

    2. **Action类**:这些类是业务逻辑的入口点,处理用户提交的表单数据,并调用相应的服务层方法。Action类通过`execute()`方法响应用户请求,并返回一个表示视图结果的ActionForward对象。 3. **Form Bean**:用于...

    struts2入门经典例子

    例如,你可以使用`s:form`标签创建表单,`s:textfield`生成输入框,`s:submit`创建提交按钮,以及`s:actionerror`显示验证错误等。 通过这个入门例子,你可以逐步了解Struts2的运行机制,包括请求处理、数据绑定、...

    struts简单的入门登录例子

    表单会提交到`LoginAction`,通过POST请求传递用户输入的数据。 3. **ActionForm**:Struts中的Form Bean类,用于封装用户的输入数据。在登录示例中,可能有一个`LoginForm`类,它有对应的属性如`username`和`...

    Struts入门笔记+源代码(登陆系统)

    JSP页面中通常会使用Struts的标签库,如`<s:form>`、`<s:textfield>`等,来与Action类进行数据绑定和表单提交。 5. **控制器**:Struts框架本身充当了控制器角色,负责接收HTTP请求,调用相应的Action处理,然后...

    JavaBean入门 - 概念和简单例子

    ### JavaBean入门概念与简单示例 #### 一、JavaBean简介 JavaBean是一种符合特定规范的Java类,主要用于封装数据或实现简单的业务逻辑。它通常用于Java Web开发中的MVC(Model-View-Controller)架构中作为模型层...

    struts的入门学习

    此外,还需要掌握如何处理表单提交,文件上传,以及错误和异常处理等常见功能。 在实际开发中,Struts1.x 提供了强大的标签库,使得开发者可以方便地在JSP页面中进行业务逻辑和视图展示的分离。通过ActionForm可以...

    Java_Web快速入门——全十讲

    #### 第六讲:表单提交与数据处理 ##### 1. 表单基础 - **HTML 表单**:用于收集用户输入的数据。 - **标签**: - `<form>`:定义表单,指定 action 和 method 属性。 - `<input>`:用于创建各种类型的输入控件。...

    struts入门

    在Struts框架中,主要涉及到以下几种关键配置和组件: 1. **JSP页面**: JSP(Java Server Pages)是Struts框架中用于展示数据的页面。例如,在提供的代码片段中,通过表单元素收集用户的输入信息。 ```html <form...

    前端入门基础及框架入门应用.md

    ### 前端入门基础及框架入门应用 本篇文章旨在为初学者介绍前端开发的基础概念以及常用技术的应用方法。文章内容覆盖了HTML的基础语法、标签使用及其相关属性,并且涉及到了CSS样式的简单运用。 #### HTML简介 ...

Global site tag (gtag.js) - Google Analytics