CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing),它容許瀏覽器向跨源服務器,發出XMLHttpRequest
請求,從而克服了AJAX只能同源使用的限制。提供了 Web 服務從不一樣域傳來沙盒腳本的方法,以避開瀏覽器的同源策略,是 JSONP 模式的現代版。與 JSONP 不一樣,CORS 除了 GET 要求方法之外也支持其餘的 HTTP 要求。用 CORS 可讓網頁設計師用通常的 XMLHttpRequest,這種方式的錯誤處理比 JSONP 要來的好。另外一方面,JSONP 能夠在不支持 CORS 的老舊瀏覽器上運做。現代的瀏覽器都支持 CORS。html
CORS是W3c工做草案,它定義了在跨域訪問資源時瀏覽器和服務器之間如何通訊。CORS背後的基本思想是使用自定義的HTTP頭部容許瀏覽器和服務器相互瞭解對方,從而決定請求或響應成功與否。W3C CORS 工做草案
同源策略:是瀏覽器最核心也最基本的安全功能;同源指的是:同協議,同域名和同端口。精髓:認爲自任何站點裝載的信賴內容是不安全的。當被瀏覽器半信半疑的腳本運行在沙箱時,它們應該只被容許訪問來自同一站點的資源,而不是那些來自其它站點可能懷有惡意的資源;參考:JavaScript 的同源策略
JSON & JSONP:JSON 是一種基於文本的數據交換方式,或者叫作數據描述格式。JSONP是資料格式JSON的一種「使用模式」,可讓網頁從別的網域要資料,因爲同源策略,通常來講位於server1.example.com的網頁沒法與不是 server1.example.com的服務器溝通,而HTML的script元素是一個例外。利用script元素的這個開放策略,網頁能夠獲得從其餘來源動態產生的JSON資料,而這種使用模式就是所謂的JSONPjava
都能解決 Ajax直接請求普通文件存在跨域無權限訪問的問題nginx
數據來源:caniuse.comgit
IE6,IE7,Opera min 不支持CORS。具體可參看數據來源中的 'show all'github
當出現以下異常時,那麼就須要考慮跨域的問題了
例如 localhost:63343 經過Ajax請求http://192.168.10.61:8080服務器資源時就會出現以下異常:web
CORS背後的基本思想是使用自定義的HTTP頭部容許瀏覽器和服務器相互瞭解對方,從而決定請求或響應成功與否ajax
CORS is not about providing server-side security. The Origin request header is produced by the browser and the server has no direct means to verify it.json
CORS 並非爲了解決服務端安全問題,而是爲了解決如何跨域調用資源。至於如何設計出 安全的開放API,倒是另外一個問題了,這裏提下一些思路:跨域
例如瀏覽器
CORS背後的基本思想是使用自定義的HTTP頭部容許瀏覽器和服務器相互瞭解對方,從而決定請求或響應成功與否.
Access-Control-Allow-Origin:指定受權訪問的域
Access-Control-Allow-Methods:受權請求的方法(GET, POST, PUT, DELETE,OPTIONS等)
適合設置單一的(或所有)受權訪問域,全部配置都是固定的,特簡單。也沒根據請求的類型作不一樣的處理
在web.xml 中添加filter
新增CORSFilter 類
Access-Control-Allow-Origin只能配置 或者一個域名*
好比配置了192.168.56.130,那麼只有192.168.56.130 能拿到數據,不然所有報403異常
這裏是一個nginx啓用COSR的參考配置:來源
由於知道已經有能夠用的庫能夠解決,因此就沒重複造輪子了。其實由於懶,看看別人的源碼算了。。。
在mvnrepository搜索cors-filter,目前也就兩個能夠用
這兩個也都大同小異,由於ebay開源在github上,也有詳細的README,那麼就以ebay的cors-filter爲例
添加依賴包到項目
cors在開發WebService、RESTful API 時常常會遇到,在之前可能直接經過jsonp解決,jsonp怎麼樣就很少說了。 總之,CORS技術規範出來這麼久了,若是不考慮IE6 IE7的問題,那麼仍是積極擁抱CORS吧
上文三種解決方案,經過搜索引擎均能找到,但估計大部分都是用的第一種最簡單的無腦的Cors Filter處理,第二種方案是經過nginx配置的,並不適合全部Web應用。第三種,考慮得很周全,並且使用方便,若是不考慮造重複輪子,推薦使用。