2016-11-25 11 views
1

を特殊文字を使用した場合、デコード/不気味エン取得します:サーバー応答は、私がのExt JSを使用していますが、私は次のような問題に遭遇していますフロントエンドとAJAX libにとして

私は、バックエンドにアップロードされなければならないファイルを、アップロードしていますバックエンドはリポジトリ内の対応するファイルパス(いくつかのメタデータを含む)で応答します。答えは、HTML構造内のJSONです。応答内の次のパスで

バックエンドの答えを(内線JSファイルのアップロードが非表示のiframeを作成し、それ以外のiFrameのドメインがブラウザから異なるのでこれが行われる必要があります):

/documents/test/uploadTesthtml_ü_&/uploadTesthtml_ü_&.jpg 

ネットワークパネルでパスは正しいです。成功ハンドラがで蹴るようしかし、すぐに、応答は、このパスが含まれています

/documents/test/uploadTesthtml_ü_&/html_ü_&.jpg 

私はあなたがそれの人生を見ていないとき、これは、理解することはかなり混乱していることを得るが、私たちはこのために準備する必要があります私の説明に従うことを願っています。


編集アレクサンダーさんのコメント@への答えとして:

我々は、Javaのバックエンドを使用していて、私たちのJSONレスポンスを中心に、以下のHTML構造を使用します。

<html> 
    <head> 
     <script> 
      function doDomainRelaxing() { 
       var x = location.hostname.indexOf('.') + 1; 
       if (x > 0) 
        document.domain = location.hostname.substring(x); 
      } 
      doDomainRelaxing(); 
     </script> 
    </head> 
    <body> 
     [{...}] //JSON response 
    </body> 
</html> 

私の知る限りでは、その理由は、ExtJSがファイルアップロードに隠されたiFrameを使用し、それがサーバからの応答を受信した後、レスポンスがiFrameから取得されてresponse.responseTextを偽造するというものでした。ブラウザーポップアップのドメインは緩和されますが、iFrameのドメインはそうではありません。したがって、同じ発信元ポリシーに問題があり、response.responseTextが空でした。これを解決するために、前述のHTMLラッパーを使用してiFrameのドメインをリラックスさせます。

+0

どのバックエンドをお使いですか?私たちのファイルをC#バックエンドにアップロードするには、HTML構造は使用しません。これは特別に調整されたJSONレスポンスで、すべてのファイル名で動作します。 – Alexander

答えて

0

この問題の原因は、応答の周りのHTMLラッパーと、JSONがラッパーに書き込まれた方法です。

元々JSONは本文のHTML応答に直接書き込まれていたため、ブラウザはコンテンツをHTMLエンティティとして解釈するため、&uuml;はiFrame HTMLのüにデコードされました。その後、ExtJSが非表示のiFrameから応答を受け取ると、それは符号化されましたが、ではなく、&のみです。解決策は、JSを介してボディをレンダリングした後にJSON応答を追加することでした。

<html> 
    <head> 
     <script> 
      function doDomainRelaxing() { 
       var x = location.hostname.indexOf('.') + 1; 
       if (x > 0) 
        document.domain = location.hostname.substring(x); 
      } 
      doDomainRelaxing(); 
     </script> 
    </head> 
    <body> 
     <script> 
      document.body.innerText = [{...}] //JSON response 
     </script> 
    </body> 
</html> 

、その後、私は応答して&amp;を復号化するために私の成功ハンドラでExt.htmlDecode(response.responseText);を使用する必要がありました。

関連する問題