1. 程式人生 > >關於跨域的二三事

關於跨域的二三事

首先說一下開發環境,伺服器是IIS8,客戶端應該是WebKit核心的瀏覽器,通過WebService通訊。

簡單說來,跨域問題是a.com訪問b.com時出現的,為保證訪問伺服器的安全,阻止不同域名間對資源的請求(大概是這樣吧)。因為客戶端是基於本地HTML頁面的,因此需要解決跨域問題才可以與伺服器通訊。

當跨域問題出現時,伺服器一般會返回一個405錯誤,同時在控制檯還可以看到一串英文(忘了),大意為訪問被禁止。這時就要配置伺服器的Response Head,在web.config檔案中新增以下設定:
<system.webServer>       <httpProtocol>         <customHeaders>           <add name="Access-Control-Allow-Origin" value="*" />           <add name="Access-Control-Allow-Methods" value="GET,POST,OPTIONS" />           <add name="Access-Control-Allow-Headers" value="Content-Type, soapaction" />         </customHeaders>       </httpProtocol>
 
</system.webServer> 
還有
<system.web>       <webServices>         <protocols>           <add name="HttpSoap" />           <add name="HttpPost" />           <add name="HttpGet" />           <add name="Documentation" />         </protocols>       </webServices>
 
</system.web>
這個據說也有用,具體沒驗證過。 

如果一切正常的話,在此時使用XmlHttpRequest時會出現另一個405,通過分析可以知道伺服器沒有配置處理OPTIONS方法。因為OPTIONS方法會返回伺服器允許的方法列表,可能被用於黑客攻擊,所以會被禁止。但OPTIONS是跨域傳送XML所必需的,因此要配置伺服器來處理OPTIONS,在IIS配置中的Handler Mapping中刪掉
OPTIONSVerbHandler或者是OPTIONS,就可以允許伺服器處理OPTIONS。

在web.config中再新增這麼一句來處理OPTIONS:
<handlers accessPolicy="Read, Script">
 
    <add name="OPTIONS" path="*" verb="OPTIONS" modules="ProtocolSupportModule" resourceType="Unspecified" /></handlers> 
就可以傳送XML了。 

另外使用XmlHttpRequest時要設定非同步為false,原因未知。也可能是其他程式碼寫錯導致無法非同步。 

好了先說這麼多,關於跨域的具體解釋以及OPTIONS還有PreFlight等有空再新增

參考:
http://blog.darkthread.net/post-2014-09-29-cors-options-preflight-and-iis.aspx
http://stackoverflow.com/questions/15584909/cors-405-method-not-allowed/15599025