遇到的问题: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这个字段,这个字段规定了能够获得本资源的域,若是头信息有此字段,这个字段与客户端浏览器应该是同域的。