`
sunxboy
  • 浏览: 2870126 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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

阅读更多

1 javascript ,设置一个变量,只允许提交一次。 
<script language="javascript" type="text/javascript">
   var checkSubmitFlg = false;
   function checkSubmit() {
   if (checkSubmitFlg == true) {
   return false;
   }
   checkSubmitFlg = true;
   return true;
   }
   document.ondblclick = function docondblclick() {
   window.event.returnValue = false;
   }
   document.onclick = function doconclick() {
   if (checkSubmitFlg) {
   window.event.returnValue = false;
   }
   }
  </script>

<html:form onsubmit="return checkSubmit();" method="post" action="myAction.do">
2 还是javascript,将提交按钮或者image置为disable  
<html:form method="post" action="myAction.do">
onsubmit="getElById('submitInput').disabled = true; return true;">   
<html:image border="0" src="http://www.cn-java.com/www1/images/ok_b.gif" styleid="submitInput"> </html:image>
</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中:  
//
// value="6aa35341f25184fd996c4c918255c3ae">
if (!isTokenValid(request))
errors.add(ActionErrors.GLOBAL_ERROR,
new ActionError("error.transaction.token"));
resetToken(request); //删除session中的令牌  
3. action有这样的一个方法生成令牌  
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中可以
JSP页面
  </html:form> </html:form>

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 添加中转页面

TAG: Struts jsp

分享到:
评论

相关推荐

    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