關於跨域的二三事
阿新 • • 發佈:2018-12-24
首先說一下開發環境,伺服器是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:
就可以傳送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
簡單說來,跨域問題是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