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

1 javascript ,设置一个变量,只允许提交一次。
  <script language="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 action="myaction.do" method="post" onsubmit="return checksubmit();">  
  2 还是javascript,将提交按钮或者image置为disable  
   <html:form action="myaction.do" method="post"
   onsubmit="getelbyid('submitinput').disabled = true; return true;">   
   <html:image styleid="submitinput" src="images/ok_b.gif" border="0" /> 
   </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中:  
   //<input type="hidden" name="org.apache.struts.taglib.html.token"
   // 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);
   }
   }

(0)

相关推荐

  • jsp 重复提交问题

    看了网上的,有几种方法: 1 在你的表单页里HEAD区加入这段代码: 复制代码 代码如下: <META HTTP-EQUIV="pragma" CONTENT="no-cache"> <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate"> <META HTTP-EQUIV="expires" C

  • JSP刷新页面表单重复提交问题解决办法分享

    使用sessionID和时间戳作为标识,关键代码如下: 复制代码 代码如下: public class SswpdjAction extends BaseAction{     public String execute(){     /**业务代码**/     ................     //设置标识     this.setSessionToken();     //转到添加页面     return "toAdd";     }     public String

  • JSP使用自定义标签防止表单重复提交的方法

    本文实例讲述了JSP使用自定义标签防止表单重复提交的方法.分享给大家供大家参考.具体如下: 1. 编写servelt: package cn.itcast.apsliyuan.web.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletReques

  • jquery ajax 如何向jsp提交表单数据

    AJAX越来越火了,作为一个WEB程序开发者要是不会这个感觉就要落伍,甚至有可能在求职的时候屡被淘汰.我也是一个WEB程序开发者,当然我也要 "随波逐流"一把,不然饭碗不保啊! 之前实现AJAX使用Javascript脚本一个一个敲出来的,很繁琐.学习Jquery之后就感觉实现AJAX并不是那么的困难了,当然除了 Jquery框架外还有其它的优秀框架这里我就着重说下比较流行的Jquery.Jquery AJAX提交表单有两种方式,一是url参数提交数据,二是form提交(和平常一样在后

  • JSP针对表单重复提交的处理方法

    本文实例讲述了JSP针对表单重复提交的处理方法.分享给大家供大家参考,具体如下: 1. 在生成表单时执行如下: 复制代码 代码如下: session.setAttribute("forum_add", "forum_add"); 2. 提交处理时作如下判断 if (isRedo(request, "forum_add")) { //提示重复提交,作相关处理 } 相关函数: /** * 判断是否为重复提交 * 1,检查Session中是否含有指定名

  • jquery ajax提交表单从action传值到jsp实现小结

    jsp页面: 复制代码 代码如下: var clientTel = $("#clientTel").val(); var activityId = $("#activityId").val(); $.ajax({ type : "post",//发送方式 url : "/arweb/reserve/saveCode.action",// 路径 data : "clientTel="+clientTel+&q

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

    1 javascript ,设置一个变量,只允许提交一次. <script language="javascript"> var checksubmitflg = false; function checksubmit() { if (checksubmitflg == true) { return false; } checksubmitflg = true; return true; } document.ondblclick = function docondblcl

  • 详谈表单重复提交的三种情况及解决方法

    第一种情况:提交完表单以后,不做其他操作,直接刷新页面,表单会提交多次. - 在servlet中写一句输出,用来判断是否提交多次 System.out.println("已经插入"); request.getRequestDispatcher("/login_success.jsp").forward(request, response); - 这样的话,刷新多少次,就会在控制器显示多少个"已经插入". - 根本原因:Servlet处理完请求以后

  • php解决和避免form表单重复提交的几种方法

    前言 为什么要避免form表单被重复提交呢?因为我们不想让我们的服务器重复处理没必要的数据,同时我们也是避免我们的数据库产生重复的数据,避免表单重复提交也是让我们的网站更安全的一种表现. 先看一下有哪些情况下回导致表单重复提交呢,知道哪些情况下可能会出现表单重复提交就可以从根源处理表单重复提交的情况了. 下面的情况就会导致表单重复提交: 点击提交按钮两次. 点击刷新按钮. 使用浏览器后退按钮重复之前的操作,导致重复提交表单. 使用浏览器历史记录重复提交表单. 浏览器重复的HTTP请求. 网页被恶

  • mvc中form表单提交的三种方式(推荐)

    第一种方式:submit 按钮 提交 <form action="MyDemand" method="post"> <span>关键字:</span> <input name="keywords" type="text" value="@keywords" /> <input type="submit" value="搜索&

  • PHP防止表单重复提交的几种常用方法汇总

    本文较为详细的汇总了PHP防止表单重复提交的几种常用方法,在PHP程序开发中有着很高的实用价值.具体方法如下: 1. 使用JS让按钮在点击一次后禁用(disable).采用这种方法可以防止多次点击的发生,实现方式较简单. 缺点是若客户端禁止JavaScript脚本,则失效. 2. 在提交成功后执行页面重定向(redirect).转到提交成功信息页面. 特点:避免F5重复提交,消除浏览器前进和后退按钮可导致的同样问题. 3. 表单隐藏域中存放session(表单被请求时生成的标记).采用此方法在接

  • springmvc 防止表单重复提交的两种方法

    目录 1.通过session中的token验证 步骤1:创建自定义注解 步骤2:创建自定义拦截器(@slf4j是lombok的注解) 步骤3:将自定义拦截器添加到配置文件 2.通过当前用户上一次请求的url和参数验证重复提交 步骤1:创建自定义注解 步骤2:创建自定义拦截器 步骤3:将自定义拦截器添加到配置文件 最近在本地开发测试的时候,遇到一个表单重复提交的现象. 因为网络延迟的问题,我点击了两次提交按钮,数据库里生成了两条记录.其实这种现象以前也有遇到过,一般都是提交后把按钮置灰,无法再次提

  • jQuery的 $.ajax防止重复提交的两种方法(推荐)

    下面给大家带来两种关于jquery 的ajax防止重复提交的解决方法,具体介绍如下所示: 1.第一种,对于onclick事件触发的的ajax 可以采用如下方法: 即在beforeSend中使点击按钮不可用,ajax结果返回后置为可用 $.ajax( { type: 'POST', url: APP+'?m=Shopping&a=ajaxSubmitorder&sid='+sid+'&src='+src, cache:false, dataType: 'json', data: {'

  • c++ 防止头文件重复引入的三种方法

    在之前我们详细介绍了 C 语言中如何使用宏定义(#ifndef / #define / #endif)来有效避免头文件被重复 #include,此方式在 C++ 多文件编程中也很常用. 举个例子,如下是一个 C++ 项目,其内部含有 school.h 和 student.h 这 2 个头文件以及 main.cpp 源文件,其各自包含的代码为: //student.h class Student {     //...... }; //school.h #include "student.h&qu

  • C#去除DataTable重复数据的三种方法

    业务需求 最近做一个把源数据库的数据批次导出到目标数据库.源数据库是采集程序采集而来的原始数据库,所以需要对其进行一些处理(过滤一些为空,长度太短或太长,非法字符,重复数据)然后在进行入库. 其中要避免目标库插入重复数据.这重复数据可能是源数据库本身就有重复数据,还有就是已经插入避免重复插入. 过滤自身重复数据解决方案 第一种:采用DataView.ToTable()方法 DataView.ToTable 方法 .NET Framework 2.0 其根据现有 DataView中的行,创建并返回

  • 浅谈Java实现分布式事务的三种方案

    一.问题描述 用户支付完成会将支付状态及订单状态保存在订单数据库中,由订单服务去维护订单数据库.由库存服务去维护库存数据库的信息.下图是系统结构图: 如何实现两个分布式服务(订单服务.库存服务)共同完成一件事即订单支付成功自动减库存,这里的关键是如何保证两个分布式服务的事务的一致性. 尝试解决上边的需求,在订单服务中远程调用减库存接口,伪代码如下: 订单支付结果通知方法{ ​ 更新支付表中支付状态为"成功". ​ 远程调用减库存接口减库存. } 上边的逻辑说明: 1.更新支付表状态为本

随机推荐