ECM
ECM
总版主
总版主
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:1151回复:0

SWFUpload的cookie Bug解决方法

楼主#
更多 发布于:2016-01-10 13:29
今天,解决火狐浏览器用swfupload上传apk包时获取不到用户身份的问题,发现是cookie为空引起的。经查证,发现很多程序员都遇到这个问题,问题是:在非IE内核的浏览器(如火狐、chrome等)下使用SWFUpload上传文件时,该请求会忽略自身浏览器中的所有cookie,只会将IE浏览器下的属于该域的持久cookie(persistent cookies)发送到服务端,非持久cookie( Session only)不会被发送。这是flashplayer的bug,而且他们说到现在adobe也没有要解决这个东西的意图。解决方法有两个,如下:
(一)
幸运的是AS3提供的URLRequest对象来包装客户端请求,我们可以上传文件的同时,给请求添加POST值对。因此当我们的上传程序需要依赖客户端cookie的时候,我们可以在上传开始前使用JS将我们需要的cookie读取出来,然后使用SWFUpload提供的addPostParam方法添加到POST中去,服务端从POST中接受所需要的"cookie"值即可,不再依赖Request中的cookie机制。
(二)
直接用  core/plugins/swfupload.cookies.js 插件,这个插件会自动遍历当前域下的所有 cookies 并自动 addPostParam 到swf里同时会回传到 upload.php 目标处理程序里, 比如现在有 $_COOKIE['silver'] 那么在 upload 里就直接 $_POST['silver'] 便可以获得了,获得后有时候需要进行decode一下即可,自己再存一遍cookie。


【插件 svn/  swfupload/ trunk/ core/ plugins/ swfupload.cookies.js】




var SWFUpload;
if (typeof(SWFUpload) === "function") {
        SWFUpload.prototype.initSettings = function (oldInitSettings) {
                return function (userSettings) {
                        if (typeof(oldInitSettings) === "function") {
                                oldInitSettings.call(this, userSettings);
                        }
                      
                        this.refreshCookies(false);     // The false parameter must be sent since SWFUpload has not initialzed at this point
                };
        }(SWFUpload.prototype.initSettings);
      
        // refreshes the post_params and updates SWFUpload.  The sendToFlash parameters is optional and defaults to True
        SWFUpload.prototype.refreshCookies = function (sendToFlash) {
                if (sendToFlash === undefined) {
                        sendToFlash = true;
                }
                sendToFlash = !!sendToFlash;
              
                // Get the post_params object
                var postParams = this.settings.post_params;
              
                // Get the cookies
                var i, cookieArray = document.cookie.split(';'), caLength = cookieArray.length, c, eqIndex, name, value;
                for (i = 0; i <</span> caLength; i++) {
                        c = cookieArray;
                      
                        // Left Trim spaces
                        while (c.charAt(0) === " ") {
                                c = c.substring(1, c.length);
                        }
                        eqIndex = c.indexOf("=");
                        if (eqIndex > 0) {
                                name = c.substring(0, eqIndex);
                                value = c.substring(eqIndex + 1);
                                postParams[name] = value;
                        }
                }
              
                if (sendToFlash) {
                        this.setPostParams(postParams);
                }
        };


}

 

 

 

 

 

 

 

异常中心网是一家专门收集整理程序员编程过程中遇到的常见异常(exception)以及各种异常问答中心的网站。异常中心网旨在,减少程序员在编码遇到异常,处理各种异常时间和痛苦,让程序员能更愉快的、快速的定位异常并查找对应的异常解决方案。异常中心网诚心打造最完美的编程社区为程序员用户服务,努力成为最好的程序员乐园程序员社区程序异常中心程序bug中心异常问答中心

 

喜欢0 评分0
游客

返回顶部