【问题标题】:IE crossdomain filter on flex application弹性应用程序上的 IE 跨域过滤器
【发布时间】:2010-01-22 02:36:44
【问题描述】:

我有一个使用弹性表单来捕获用户输入的应用程序。当用户输入表单数据(包括绘图区域)时,应用程序会创建表单的 jpg 图像并将其发送回服务器。由于数据敏感,所以必须使用 https。此外,客户端需要将 jpg 和 pdf 版本的表单存储在服务器上。

应用程序分三步发回数据

1 - 发送带有订单号的 jpg 快照

2 - 将表单数据字段作为发布数据发送,使其在地址栏中不可见

3 - 发送 pdf 数据

我先使用urlloader发送jpg数据,等待服务器响应后再执行操作2和3,以确保服务器已创建与新orderNumber关联的记录。

此代码在 IE 中通过 http 运行良好。但是如果我尝试通过 https 使用应用程序,IE 会阻止来自存储 jpg 步骤的页面响应,并且 urlloader 的完整事件永远不会触发。该应用程序通过 http 或 https 在 FireFox 中运行良好。

这里是crossdomain.xml(我已经用“”替换了域):

<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">

<cross-domain-policy>

  <allow-access-from domain="*.<mydomain>.com" to-ports="*" secure="false"/>
  <allow-http-request-headers-from domain="*.<mydomain>.com" headers="*">

</cross-domain-policy> 

这是用户按下提交按钮时执行的代码:

私有函数loaderCompleteHandler(event:Event):void {

            sendPDF();
            sendPatientData();
        }


        private function submitOrder(pEvt:MouseEvent):void
        {
            //disable submit form so the order can't be submitted twice
            formIsValid = false;
            waitVisible = true;

            //submit the jpg image first with the order number, userID, provID
            //and order type.  The receiveing asp will create the new order record
            //and save the jpg file.  jpg MUST be sent first.
            orderNum = userID + "." + provID + "." + Date().toString() + "." + orderType;

            var jpgURL:String = "https://orders.mydomain.com/orderSubmit.asp?sub=jpg&userID=" + userID + "&provID=" + provID + "&oNum=" + orderNum + "&oType=" + orderType;

            var jpgSource:BitmapData = new BitmapData (vbxPrint.width, vbxPrint.height);
            jpgSource.draw(vbxPrint);
            var jpgEncoder:JPEGEncoder = new JPEGEncoder(100);
            var jpgStream:ByteArray = jpgEncoder.encode(jpgSource);

            var header:URLRequestHeader = new URLRequestHeader ("content-type", "application/octet-stream");

            //Make sure to use the correct path to jpg_encoder_download.php
            var jpgURLRequest:URLRequest = new URLRequest (jpgURL);     
            jpgURLRequest.requestHeaders.push(header);              
            jpgURLRequest.method = URLRequestMethod.POST;               
            jpgURLRequest.data = jpgStream;

            //navigateToURL(jpgURLRequest, "_blank");

            var  jpgURLLoader:URLLoader = new URLLoader();

            try
            {
                jpgURLLoader.load(jpgURLRequest);
            }
            catch (error:ArgumentError)
            {
                trace("An ArgumentError has occurred.");
            }
            catch (error:SecurityError)
            {
                trace("A SecurityError has occurred.");
            }

            jpgURLLoader.addEventListener(Event.COMPLETE, loaderCompleteHandler);

        }


        private function sendPatientData ():void
        {
            var dataURL:String = "https://orders.mydomain.com/orderSubmit.asp?sub=data&oNum=" + orderNum + "&oType=" + orderType;

            //Make sure to use the correct path to jpg_encoder_download.php
            var dataURLRequest:URLRequest = new URLRequest (dataURL);       
            dataURLRequest.method = URLRequestMethod.POST;
            var dataUrlVariables:URLVariables = new URLVariables(); 

            dataUrlVariables.userID = userID
            dataUrlVariables.provID = provID
            dataUrlVariables.name = txtPatientName.text
            dataUrlVariables.dob = txtDOB.text
            dataUrlVariables.contact = txtPatientContact.text
            dataUrlVariables.sex=txtSex.text
            dataUrlVariables.ind=txtIndications.text

            dataURLRequest.data = dataUrlVariables
            navigateToURL(dataURLRequest, "_self");     

        }

        private function sendPDF():void
        {
            var url:String = "https://orders.mydomain.com/pdfOrderForm.asp"
            var fileName:String = "orderPDF.pdf&sub=pdf&oNum=" + orderNum + "&oType=" + orderType + "&f=2&t=1" + "&mid=" + ModuleID.toString()
            var jpgSource:BitmapData = new BitmapData (vbxPrint.width, vbxPrint.height);
            jpgSource.draw(vbxPrint);
            var jpgEncoder:JPEGEncoder = new JPEGEncoder(100);
            var jpgStream:ByteArray = jpgEncoder.encode(jpgSource);

            myPDF = new PDF( Orientation.LANDSCAPE,Unit.INCHES,Size.LETTER);
            myPDF.addPage(); 
            myPDF.addImageStream(jpgStream,0,0, 0, 0, 1,ResizeMode.FIT_TO_PAGE );
            myPDF.save(Method.REMOTE,url,Download.ATTACHMENT,fileName);

        }

除了基本的站点页面模板之外,目标asp页面没有发回任何数据。

谁能帮我弄清楚如何解决这个 IE 跨域问题?我已经在 IE 工具安全设置中关闭了 XSS 过滤器,但仍然没有解决问题。

谢谢

【问题讨论】:

    标签: flex3


    【解决方案1】:

    通过 https 做所有事情。从 https url 加载 swf。通过 https 发送初始表单帖子。通过 https 发送图像。

    【讨论】:

    • 谢谢山姆。加载 swf 的页面来自 https url,flex 代码中的所有 url 都是明确的 https:// url。我最近在服务器响应中添加了 X-XSS-Protection: 0 标头。我似乎仍然没有在 URLLoader 上获得 Complete 事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 2012-09-25
    • 2010-11-08
    • 2019-08-02
    • 2021-07-23
    • 1970-01-01
    • 2017-05-17
    相关资源
    最近更新 更多