遇到的問題:web
最近基於Cesium來作3D模型的地圖開發,在訪問本身發佈的WMS服務以後,遇到了GeoServer跨域問題。跨域
調用這個WMS服務的時候,瀏覽器(我用Chrome)開發者工具報錯:瀏覽器
控制檯提示以下:服務器
Font from origin 'http://xxxxxxxxxxxxx' has been blocked from loading by Cross-Origin Resource Sharing policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access.cors
這是由於服務端不容許跨域訪問所致使的問題。maven
解決方案:函數
一、下載官方的cors壓縮包,解壓獲得兩個jar包,兩個jar包文件放入geoserver目錄下web容器的類庫文件夾中。工具
二、打開geoserver目錄下web容器的中的xml配置文件。測試
三、添加過濾器代碼和過濾器路由代碼。spa
四、重啓geoserver。
ps:若是目錄中存在maven,須要在pom.xml中,添加一個依賴標籤。
pss:爲了服務你們,本人制做了壓縮包
psss:經本人測試,這個跨域訪問方法能夠應用於大多數服務器,不單單侷限於GeoServer
CORS(跨域資源共享)小課堂:
CORS須要瀏覽器和服務器同時支持。目前,全部瀏覽器都支持該功能(IE瀏覽器不能低於IE10)。
整個CORS通訊過程,都是瀏覽器自動完成,不須要用戶參與。瀏覽器一旦發現請求跨源,就會自動添加一些附加的頭信息,但用戶不會有感受。
所以,實現CORS通訊的關鍵是服務器。只要服務器實現了CORS接口,就能夠跨源通訊。
請求流程:
一、在你發送任意請求時,瀏覽器會將CORS請求合併到http請求之中。具體來講,就是在頭信息之中,增長一個Origin
字段。
二、上面的頭信息中,Origin
字段用來講明,本次請求來自哪一個源(協議 + 域名 + 端口)。服務器根據這個值,決定是否贊成此次請求。
三、若是Origin
指定的源,不在許可範圍內,服務器會返回一個正常的HTTP迴應。
4.一、瀏覽器發現,這個迴應的頭信息沒有包含Access-Control-Allow-Origin
字段,就知道出錯了,從而拋出一個錯誤,被XMLHttpRequest
的onerror
回調函數捕獲。
4.二、若是Origin
指定的域名在許可範圍內,服務器返回的響應,會多出幾個頭信息字段。
五、其中最重要的是Access-Control-Allow-Origin這個字段,這個字段規定了能夠獲得本資源的域,若是頭信息有此字段,這個字段與客戶端瀏覽器應該是同域的。