Access-Control-Allow-Origin 跨域問題


   1.同源、同源策略(Same origin policy)

    同源指的是協議,端口,域名全部相同。

    同源策略(Same origin policy)是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽器的正常功能可能都會受到影響。可以說Web是構建在同源策略基礎之上的,瀏覽器只是針對同源策略的一種實現。 

   2.跨域

    Web 瀏覽器具有一個稱為相同站點源策略的安全策略,此策略可阻止網頁訪問另一個域中的數據。 網站通常會讓其服務器在后端請求其他站點服務器中的內容,由此避開瀏覽器中的檢查,從而繞開此策略。

   3.前端跨域

    通過前端方案繞開瀏覽器的安全策略,在不同的域之間進行數據傳輸或通信,比如用ajax向一個不同的域請求數據,或者通過js獲取頁面中不同域的框架(iframe)中的數據。

   跨域解決辦法

    1.瀏覽器目標添加命令,允許跨域訪問(此種方案只適合個人):

      第一種:--allow-file-access-from-files

      第二種:--disable-web-security

    2.后台配置web.xml過濾器(不推薦)      

1 <filter>
2     <filter-name>CorsFilter</filter-name>
3     <filter-class>com.itxc.filter.CORSFilter</filter-class>
4 </filter> 
5 <filter-mapping>
6     <filter-name>CorsFilter</filter-name>
7     <url-pattern>/*</url-pattern>
8 </filter-mapping>
View Code    
 1 <!-- 支持跨域 -->
 2     <filter>
 3         <filter-name>CORS</filter-name>
 4         <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
 5         <init-param>
 6             <param-name>cors.allowOrin</param-name>
 7             <param-value>*</param-value>
 8         </init-param>
 9         <init-param>
10             <param-name>cors.supportedMethods</param-name>
11             <param-value>GET, POST, HEAD, PUT, DELETE, OPTIONS</param-value>
12         </init-param>
13     </filter>
14     <filter-mapping>
15         <filter-name>CORS</filter-name>
16         <url-pattern>/*</url-pattern>
17     </filter-mapping>
支持跨域

    3.配置Nginx代理服務器(推薦)

      具體查看配置Nginx文章 

    4.JSONP方法,JSONP方法是一種非官方方法,而且這種方法只支持GET方式,不如POST方式安全。在被請求的Response header中加入header參數就可以實現ajax POST跨域訪問了。

      // 指定允許其他域名訪問 

      header('Access-Control-Allow-Origin:*'); 

      // 響應類型 

      header('Access-Control-Allow-Methods:POST'); 

      // 響應頭設置 

      header('Access-Control-Allow-Headers:x-requested-with,content-type'); 

      Access-Control-Allow-Origin:* 表示允許任何域名跨域訪問

      如果需要指定某域名才允許跨域訪問,只需把Access-Control-Allow-Origin:*改為Access-Control-Allow-Origin:允許的域名

    5.通過iframe 方式跨域訪問,具體不做詳解。 

    總結:傳統的跨域請求沒有好的解決方案,無非就是jsonp和iframe,隨着跨域請求的應用越來越多,W3C提供了跨域請求的標准方案(Cross-Origin Resource Sharing)。IE8、Firefox 3.5 及其以后的版本、Chrome瀏覽器、Safari 4 等已經實現了 Cross-Origin Resource Sharing 規范,實現了跨域請求。在服務器響應客戶端的時候,帶上Access-Control-Allow-Origin頭信息。

    如果設置 Access-Control-Allow-Origin:*,則允許所有域名的腳本訪問該資源。

    Access-Control-Allow-Origin:http://www.phpddt.com.com,允許特定的域名訪問

    配置服務器配置信息:    

 1 <system.web>
 2     <!--提供Web服務訪問方式-->
 3     <webServices>
 4       <protocols>
 5         <add name="HttpSoap"/>
 6         <add name="HttpPost"/>
 7         <add name="HttpGet"/>
 8         <add name="Documentation"/>
 9       </protocols>
10     </webServices>
11  </system.web>
System.web

 

 1 <configuration>
 2  <system.webServer>  
 3     <httpProtocol>   
 4     <customHeaders>   
 5       <add name="Access-Control-Allow-Methods" value="OPTIONS,POST,GET"/>   
 6       <add name="Access-Control-Allow-Headers" value="x-requested-with,content-type"/>   
 7       <add name="Access-Control-Allow-Origin" value="*" /> //* 是任意網站可以跨域,加域名可以指定域名跨域。
 8     </customHeaders>   
 9   </httpProtocol>   
10   <modules>  
11     <add name="MyHttpModule" type="WebServiceDemo.MyHttpModule"/>  
12   </modules>
13   </system.webServer>  
14 </configuration>
Configuration

 

備注:
作者:Shengming Zeng
博客:http://www.cnblogs.com/zengming/

本文是原創,歡迎大家轉載;但轉載時必須注明文章來源,且在文章開頭明顯處給明鏈接。
<歡迎有不同想法或見解的同學一起探討,共同進步>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM