關於跨域的二三事

首先說一下開發環境,服務器是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 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章