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

时间:2007-11-21 21:05:29  来源:  作者:

前两种是利用javascript,后面一种是在使用Struts的情况下的参考实现xFy第一天空网络

1 javascript ,设置一个变量,只允许提交一次。xFy第一天空网络
    xFy第一天空网络
    var checkSubmitFlg = false;    xFy第一天空网络
    function checkSubmit()       xFy第一天空网络
        checkSubmitFlg = true;      xFy第一天空网络
        return true;   xFy第一天空网络
        }   xFy第一天空网络
        document.ondblclick = function docondblclick() xFy第一天空网络
           xFy第一天空网络
        document.onclick = function doconclick()    xFy第一天空网络
    }xFy第一天空网络

2 还是javascript,将提交按钮或者image置为disablexFy第一天空网络

onsubmit="getElById('submitInput').disabled = true; return true;">             xFy第一天空网络

3 利用struts的同步令牌机制xFy第一天空网络

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

基本原理:xFy第一天空网络

服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,xFy第一天空网络
看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给xFy第一天空网络
客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次xFy第一天空网络
提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。xFy第一天空网络

    if (isTokenValid(request, true)) xFy第一天空网络
     else xFy第一天空网络

Struts根据用户会话ID和当前系统时间来生成一个唯一(对于每个会话)令牌的,具体实现可以参考xFy第一天空网络
TokenProcessor类中的generateToken()方法。xFy第一天空网络

1. //验证事务控制令牌,会自动根据session中标识生成一个隐含input代表令牌,防止两次提交xFy第一天空网络

2. 在action中:xFy第一天空网络

       //if (!isTokenValid(request))           xFy第一天空网络
    errors.add(ActionErrors.GLOBAL_ERROR,                      xFy第一天空网络
    new ActionError("error.transaction.token"));       xFy第一天空网络
    resetToken(request); //删除session中的令牌xFy第一天空网络

3. action有这样的一个方法生成令牌xFy第一天空网络

   protected String generateToken(HttpServletRequest request) xFy第一天空网络
     catch (IllegalStateException e) xFy第一天空网络
         catch (NoSuchAlgorithmException e) xFy第一天空网络
           xFy第一天空网络
        } xFy第一天空网络

文章评论

共有 位天空网友发表了评论 查看完整内容

特别推荐
  • 文字广告
  • 文字广告
  • 文字广告
  • 文字广告
站长黑板报

24小时热门信息