2016-11-25 60 views
1

隨着前端和AJAX LIB當我使用Ext JS的,我遇到以下問題:服務器響應變得古怪加密/解碼中使用特殊字符

我上傳一個文件,該文件將被上傳到後端後端用存儲庫中相應的文件路徑回答,包括一些元數據。整個答案是一個HTML結構中的JSON。 (這需要做,因爲Ext JS的文件上傳創建一個隱藏的iframe和否則iFrame的域名從瀏覽器不同)

與響應裏面以下路徑後端答案:

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

在網絡面板中,路徑是正確的。但只要成功處理踢,響應包含以下路徑:

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

我得到的,這是非常令人迷惑明白,當你還沒有看到它的生活,但我們需要爲此準備具體的用例,我希望你可以按照我的解釋。


編輯的答案@亞歷山大的評論:

我們使用的是Java後端,並使用以下HTML結構圍繞我們的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> 
     [{...}] //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> 

事後我不得不使用Ext.htmlDecode(response.responseText);我的成功處理程序的響應&amp;解碼。