`
primer_2004
  • 浏览: 127958 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JSP(Struts)避免Form重复提交的几种方案

阅读更多
1 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();">  

2 还是javascript,将提交按钮或者image置为disable  
  1. <html:form action="myAction.do" method="post"    
  2.    onsubmit="getElById('submitInput').disabled = true; return true;">       
  3.    <html:image styleId="submitInput" src="http://www.rdxx.com/Files/Pic/2007-7/4/HKDJF7EDAA0858I8KC.gif" border="0" />     
  4. 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中:  
  1. //<input type="hidden" name="org.apache.struts.taglib.html.TOKEN"    
  2.    // value="6aa35341f25184fd996c4c918255c3ae">    
  3.    if (!isTokenValid(request))    
  4. errors.add(ActionErrors.GLOBAL_ERROR,    
  5.    new ActionError("error.transaction.token"));    
  6.    resetToken(request); //删除session中的令牌      
  7.   3. action有这样的一个方法生成令牌      
  8.    protected String generateToken(HttpServletRequest request) {      
  9.    HttpSession session = request.getSession();    
  10.    try {    
  11.    byte id[] = session.getId().getBytes();    
  12.    byte now[] =    
  13.    new Long(System.currentTimeMillis()).toString().getBytes();    
  14.    MessageDigest md = MessageDigest.getInstance("MD5");    
  15.    md.update(id);    
  16.    md.update(now);    
  17.    return (toHex(md.digest()));    
  18.    } catch (IllegalStateException e) {    
  19.    return (null);    
  20.    } catch (NoSuchAlgorithmException e) {    
  21.    return (null);    
  22.    }    
  23.    }  
 
在更新的时候防止按钮重复点击,主要是用Session来做判断
在JSP/Servlet中可以
JSP页面
  1. <input type="hidden " name=" <!----> " value =" <!---->" >   

SynchroToken.java
package com.lims.util;
import org.apache.struts.util.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import org.apache.struts.action.*;
/**
  *

Title: SynchroToken


  *

Description:


  *

Copyright: Copyright (c) 2004


  *

Company: NetStar


  * @author Jstar
  * @version 1.0
  * Created in 2004/04/21
  */
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: (4/19/2004 3:24:10 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 添加中转页面

</html:form>
分享到:
评论

相关推荐

    JSP_重复提交_解决方法

    下面详细介绍几种常用的防止重复提交的方法: ##### 方法1:使用HTTP头部控制 可以在JSP页面的`&lt;head&gt;`部分加入以下代码,通过设置HTTP头部来禁止浏览器缓存当前页面: ```html , must-revalidate"&gt; , 26 Feb 1997...

    struts2防止重复提交

    Struts2提供了几种策略来防止表单的重复提交,确保请求的唯一性和事务的一致性。 一、令牌(Token)机制 Struts2的Token插件是防止重复提交的一种常见方法。这里的"Strut2Token"很可能是指这个插件的应用。它的...

    jsp+struts小项目-1

    【标题】:“jsp+struts小项目-1”是一个基于Struts1.2框架和JSP技术构建的小型Web应用程序示例。这个项目旨在帮助学习者掌握如何将这两种技术结合,实现动态网页和业务逻辑控制。 【描述】:在“jsp+struts小项目-...

    用户登录(struts1+JSP)

    而JSP(JavaServer Pages)则是一种动态网页技术,用于生成动态内容。 在Struts1中,用户登录通常涉及以下几个关键组件: 1. **Action类**:这是Struts1的核心组件,负责处理用户请求。在用户登录场景下,会有一个...

    一个Struts1多文件上传实例(附Form中传List示例)

    在Struts1中,ActionForm类需要有一个对应的List字段来接收这些值,这样在提交表单时,Struts1的默认Binding机制会自动将这些值绑定到List中。 4. **配置文件**: 配置文件(struts-config.xml)需要添加相应的...

    struts的form不能初始化java.util.Date类型

    解决这个问题有几种策略: 1. **自定义类型转换器**:可以通过继承`org.apache.struts.action.ActionForm`并重写`propertySetter`方法,或者创建一个实现了`TypeConverter`接口的类,覆盖默认的日期转换逻辑。这样...

    struts2 bookstore 网上书店 jsp 课程设计

    我们可以通过使用Struts2的标签库(例如`s:property`、`s:form`等)来简化JSP页面的编写,这些标签能直接与Action中的属性进行交互,从而减少代码量并提高可维护性。 在课程设计中,网上书店可能包括以下几个主要...

    jsp上传下载文件源代码,通过struts.xml控制在100M以内

    在Web应用中,文件上传通常涉及到表单提交、Multipart/form-data编码和服务器端的处理。在Struts2中,使用`&lt;s:file&gt;`标签创建上传文件的输入字段,并通过Interceptor拦截器处理上传文件。文件大小限制可以通过配置...

    JSP-servlet-struts-sqlserver开发的网上购物商场

    【标题】"JSP-servlet-struts-sqlserver开发的网上购物商场"揭示了这个项目是基于Java技术栈,利用JSP(JavaServer Pages)、Servlet、Struts框架以及SQL Server数据库构建的一个网上商城系统。这样的系统设计允许...

    整合Spring与Struts的几种方法

    接下来,有三种整合Spring和Struts的方法: 1. **继承Spring的ActionSupport类**:Action直接继承Spring的`ActionSupport`,并通过`ApplicationContext`获取服务。这种方式简单,但存在几个缺点:首先,Action与...

    在tarena培训 struts&jsp上

    Struts和JSP是两种广泛应用于Java Web开发的技术。Struts是一个基于MVC(Model-View-Controller)设计模式的框架,它简化了构建企业级Java Web应用程序的过程。JSP(JavaServer Pages)则是一种动态网页技术,允许...

    Struts中文文档

    通过阅读这份中文文档,开发者可以学习到如何设置Struts环境、配置Action和Form Bean、编写JSP页面、使用Struts标签、实现数据校验、处理异常、以及如何利用Struts提供的各种插件和功能来提升开发效率。同时,文档还...

    struts示例

    这两种方式在处理用户导航和防止重复提交方面有所不同。 7. **国际化和本地化**:Struts框架支持多语言,可以在应用中添加资源文件(如message.properties或message_zh_CN.properties),以便根据用户的浏览器设置...

    struts2 令牌使用例子

    在处理表单提交时,为了防止重复提交或者跨站请求伪造(CSRF)攻击,Struts2引入了令牌机制。这个"struts2 令牌使用例子"是一个很好的实践教程,帮助开发者理解如何在实际应用中实施这一安全策略。 首先,我们需要...

    用Struts实现动态单选按钮

    Struts是Java Web开发中的一款经典MVC框架,它为开发者提供了一种组织应用程序结构、控制业务逻辑和处理用户输入的方式。在这个特定的场景中,我们关注的是如何使用Struts来实现动态单选按钮。在Web应用中,动态单选...

    struts1直接跳转到jsp-无action的url

    然而,如果要直接跳转到JSP,而无需经过Action,可以有以下几种方法: 1. **使用HTML的表单提交**:在HTML表单中,可以直接指定`action`属性为JSP的URL,例如`&lt;form action="myjsp.jsp" method="post"&gt;`。这样,...

    自己写的struts程序

    在Java Web开发中,Struts框架提供了一种组织应用程序结构和控制流程的方式,使得代码更易于管理和维护。你提到的“自己写的struts程序”很可能是一个简单的用户注册应用,这是学习Struts框架的常见实践项目。 首先...

    Struts 1 学习资料

    总的来说,Struts 1提供了一种结构化的MVC框架,使得开发者能够更好地组织和管理Web应用程序的代码。虽然现代Web开发中已经有更先进的框架,如Spring MVC,但理解Struts 1的基础知识仍有助于理解Web开发的历史和演变...

    我的笔记:Struts构架中action的跳转大全

    下面将详细解析几种不同类型的Action跳转方式。 ### 1. 基本Action 基本Action定义了路径、类型、表单、输入和转发等属性。例如: ```xml &lt;param name="someParam"&gt;someValue ...

Global site tag (gtag.js) - Google Analytics