当前位置: 首页 > 图文教程 > 网络编程 > JSP > Web应用中避免Form重复提交的三种方案

JSP
Hibernate save() saveorupdate()的用法
hibernate更新数据方法小结
jsp 复选框使用方法
JSP单选按钮验证、下拉框验证、复选框验证实现代码
jsp Hibernate批量更新和批量删除处理代码
JSP彩色验证码的实例代码
[J2SE]Java中3DES加密解密调用示例
【算法】扑克发牌算法实现
java易懂易用的MD5加密(可直接运行) (1)
java 易懂易用的MD5加密(可直接运行)(2)
java 截取字符串(判断汉字)
java 中文字符串数组按照音序排列
JAVA 18位身份证号码校验码的算法
jsp JFreeChart使用心得与例子
Hibernate 查询方式总结
java struts常见错误以及原因分析
Java 获取URL的内容
JAVA (Jsp)利用Google的Translate开发API的代码
java SOAPHEADER的web service
JSP与JS交互问题 值传递

JSP 中的 Web应用中避免Form重复提交的三种方案


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-03   浏览: 85 ::
收藏到网摘: n/a

Web应用中重复提交的问题的三种解决方案

前两种是利用javascript,后面一种是在使用Struts的情况下的参考实现

  • 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>

    <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.   
    4.   <html:image styleId="submitInput" src="images/ok_b.gif" border="0" />
    5.   
    6.   </html:form>


  • 3 利用struts的同步令牌机制


  • 利用同步令牌(Token)机制来解决Web应用中重复提交的问题,Struts也给出了一个参考实现。

    基本原理:

    服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,
    看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给
    客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次
    提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。
    1. if (isTokenValid(request, true)) {
    2.     // your code here
    3.     return mapping.findForward("success");
    4. else {
    5.     saveToken(request);
    6.     return mapping.findForward("submitagain");
    7. }

    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中的令牌

    3. action有这样的一个方法生成令牌
    1.    protected String generateToken(HttpServletRequest request) {
    2.        HttpSession session = request.getSession();
    3.        try {
    4.            byte id[] = session.getId().getBytes();
    5.            byte now[] =
    6.                new Long(System.currentTimeMillis()).toString().getBytes();
    7.            MessageDigest md = MessageDigest.getInstance("MD5");
    8.            md.update(id);
    9.            md.update(now);
    10.            return (toHex(md.digest()));
    11.        } catch (IllegalStateException e) {
    12.            return (null);
    13.        } catch (NoSuchAlgorithmException e) {
    14.            return (null);
    15.        }
    16.    }