Geoserver的跨域问题

我们通常需要通过ajax跨域访问GIS服务,GeoServer默认是不支持跨域的,通常直接访问浏览器会报类似:XMLHttpRequest 、not allowed by Access-Control-Allow-Origin的错误提示。

跨域原因

同源策略:为了保证浏览器安全,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。同源是请求地址中的协议、域名、端口都相同。 同源策略是浏览器安全的基石。

解决方案

  1. 取消浏览器检验。
  2. 不使用XHR(XMLHttpRequest)请求类型(JSONP)。
  3. 被调用方在请求头里添加相关参数(CORS)支持跨域。
  4. 调用方使用反向代理,将请求在调用方的http服务器发送。或者在应用服务器中发生和接受并处理返回。。

下面主要介绍Geoserver跨域配置通过filter方案实现跨域资源的访问。

  • 下载平台独立二进制(捆绑在Jetty中的GeoServer Web应用程序),将【geoserverPath】\lib中的jetty-servlets-9.4.12.v20180830.jar和jetty-util-9.4.12.v20180830.jar。geoservePath为geoserver的安装目录。
  • 将俩个jar包复制到【geoserverPath】\webapps\geoserver\WEB-INF\lib
  • 修改【geoserverPath】\webapps\geoserver\WEB-INF目录下web.xml文件,将下列的注释取消

#  Uncomment following filter to enable CORS

<filter>
     <filter-name>cross-origin</filter-name>
     <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
    <init-param>
        <param-name>chainPreflight</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>allowedOrigins</param-name>
        <param-value>*</param-value>
    </init-param>
    <init-param>
        <param-name>allowedMethods</param-name>
        <param-value>GET,POST,PUT,DELETE,HEAD,OPTIONS</param-value>
    </init-param>
    <init-param>
        <param-name>allowedHeaders</param-name>
        <param-value>*</param-value>
    </init-param>
 </filter>

 # Uncomment following filter to enable CORS

 <filter-mapping>
     <filter-name>cross-origin</filter-name>
     <url-pattern>/*</url-pattern>
 </filter-mapping>

  • 重启服务。

注意:在安装包找不到\lib中的jetty-servlets-9.4.12.v20180830.jar,jetty-servlets包下载对应的版本。这里要下载与geoserver版本对应版本。点击这里

找到对应的版本

版权声明:
作者:Gomo
链接:https://www.develophm.com/index.php/geoserver%e7%9a%84%e8%b7%a8%e5%9f%9f%e9%97%ae%e9%a2%98/991/
来源:开发之家
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>