Goeserver数据有两种,一种需进行用户密码的权限认证,一种无须用户密码。对于网上跨域访问Geoserver数据的种种方法,对这2种数据并非通用。

笔者将Geoserver官方下载的Geoserver.war包部署到linux服务器,通过前端 ajax 访问geoserver数据失败,其中包含跨域问题和用户名密码认证问题,查询网上各类方法进行尝试,结果浏览器控制台分别报出了401,403和跨域错误提示。其中:

401错误:ajax未进行用户名密码验证导致;

403错误:用户名密码验证失败导致;

跨域错误(两种可能):

  1,真实的跨域导致;

  2,403错误引发,此时也可能真的存在跨域但不一定。

解决方法:

1. jetty方式(对于跨域,亲测可用,但用户名密码认证可否配置未探索)

步骤1, web.xml配置跨域:

在Geoserver的发布包中找到WEB-INF/web.xml,打开添加如下配置:

<filter>
<filter-name>cross-origin</filter-name>
<filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
<init-param>
<param-name>allowedOrigins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>allowedMethods</param-name>
<param-value>GET,POST,OPTIONS</param-value>
</init-param>
<init-param>
<param-name>allowedHeaders</param-name>
<param-value>x-requested-with,content-type,access-control-allow-origin,access-control-allow-methods,authorization,accept</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>cross-origin</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

步骤2,添加与Geoserver版本对应的jetty jar包。

下载jetty.sevlets.jar,jetty.utli.jar,jetty.sevlet.jar三个(前两个必须,第三是否必须未验证),复制到Geoserver发布包的/WEB-INF/lib文件夹下。

注意:jetty 的jar包要与Geoserver兼容,笔者用的是 geoserver-2.13.2-war 和 jetty的 9.2.13.v20150730版本。若想确定版本的对应关系,我了解到的一种傻瓜方法是,下载对应的Geoserver 的windows安装版,安装后在安装包中可找到相应版本的这三个jar 包,可直接复制使用。

步骤3. ajax代码

       var url="http://10.0.30.63:8093/geoserver/tiger/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=tiger:poi&maxFeatures=50&outputFormat=application%2Fjson";
$.ajax({
type: "get",
url: url,
success: function(response){
console.log(response);
},
error:function(XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus+";"+errorThrown);
},
})

  

2. Tomcat配置方式(可同时解决跨域和用户密码验证的问题,亲测可用)

步骤1. web.xml配置

在Geoserver发布包的 /WEB-INF/web.xml文件中添加如下配置:

可参考官网:http://tomcat.apache.org/tomcat-9.0-doc/config/filter.html#CORS_Filter

<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class> <!--关键部位1,cors.allowed.origins的值
    1.若需进行用户密码验证,则其值不可为“*”,可为需进行跨域的应用端域名端口的链接(如下所示),因为为“*”的该项与下面的cors.support.credentials不可同时存在,否则tomcat启动会出错。
    2.若无序进行用户名密码验证,则其值可为“*”。若为“*”,则下面的cors.support.credentials项要删除。
    注意,1条件下,其值的配置是,在欲访问的远程geoserver端的web.xml中添加web应用端域名端口的链接,如我的web应用部署在 A 电脑上,Geoserver服务器为 B 电脑,则配置B 的web.xml(在cors.allowed.origins中加入A 电脑 tomcat的域名端口链接)
 -->
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>http://10.70.1.183:8080,http://localhost:8080</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization</param-value>
</init-param>
<init-param>
<param-name>cors.exposed.headers</param-name>
<param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
</init-param> <!--关键部位2,cors.support.credentials项
  1,若需进行用户名密码验证,则必须存在;
  2. 若无效进行用户名密码验证,仅设置跨域,则可删除
--> <init-param>
<param-name>cors.support.credentials</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>cors.preflight.maxage</param-name>
<param-value>10</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

  

步骤2. ajax代码

            url='http://10.0.30.63:8093/geoserver/rest/fonts.json';

            $.ajax({
type: "get",
url: url,
headers: {
Authorization:"Basic YWRtaW46Z2Vvc2VydmVy",
},
//对于用户名密码验证,headers中Authorization项必须有,其值为加密后的“用户名:密码”,可以换成下面beforeSend的写法(两种不同的设置http请求头的方式)
// beforeSend:function(xhr){
// xhr.setRequestHeader ("Authorization","Basic YWRtaW46Z2Vvc2VydmVy");
// }, dataType: "json",
success: function(response){
console.log(response);
},
error:function(XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus+";"+errorThrown);
},
})

  

Geoserver通过ajax跨域访问服务数据的方法(含用户名密码认证的配置方式)的更多相关文章

  1. Ajax跨域访问XML数据的另一种方式——使用YQL查询语句

    XML数据默认是不能在客户端通过Ajax跨域请求读取的,一般的做法是在服务器上写一个简单的代理程序,将远程XML的数据先读到本地服务器,然后客户端再从本地服务器通过Ajax来请求.由于我们不能对数据源 ...

  2. ajax跨域访问http服务--jsonp

    在前面一篇文章<Spring Cloud 前后端分离后引起的跨域访问解决方案>里我们提到使用ajax跨域请求其他应用的http服务,使用的是后台增加注解@CrossOrigin或者增加Co ...

  3. 浅析JSONP-解决Ajax跨域访问问题

    浅析JSONP-解决Ajax跨域访问问题 很久没有写随笔了,总是感觉没时间,其实时间就是...废话少说,前几天,工作上有一新需求,需要前端web页面异步调用后台的Webservice方法返回信息.实现 ...

  4. Ajax跨域访问问题-方法大全

    Case I. Web代理的方式 (on Server A) 即用户访问A网站时所产生的对B网站的跨域访问请求均提交到A网站的指定页面,由该页面代替用户页面完成交互,从而返回合适的结果.此方案可以解决 ...

  5. Ajax跨域访问解决办法

    方法1. jsonp实现ajax跨域访问示例 jsp代码: <body> <input type="button" onclick="testJsonp ...

  6. Web Api 2(Cors)Ajax跨域访问

    支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示   随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Ang ...

  7. Hbuilder编辑App时,ajax跨域访问失败问题

    今天试着用Hbuilder写app的前段显示页面,在第一步时就被打住了,ajax异步调用服务器的登录接口时,报错, 显示这样的错误 XMLHttpRequest cannot loadhttp://w ...

  8. 关于JQuery Ajax 跨域 访问.net WebService

    关于这个 jQuery Ajax跨域访问 WebService 前天整了好几个小时没整明白 今天再看一下 结果突然就顿悟了 1.建一个空webApplication --添加--新建项--web服务( ...

  9. jQuery使用ajax跨域请求获取数据

    jQuery使用ajax跨域请求获取数据  跨域是我在日常面试中经常会问到的问题,这词在前端界出现的频率不低,主要原因还是由于安全限制(同源策略, 即JavaScript或Cookie只能访问同域下的 ...

随机推荐

  1. 【NX二次开发】创建有界平面UF_MODL_create_bplane

    先准备几条曲线如下图所示,我们用这几条线来创建一个有界平面: 效果:  源码: //有界平面 extern DllExport void ufusr(char *param, int *returnC ...

  2. Unicode编码转换, MD5加密,URL16进制加密解密

    一.站长网址:http://www.msxindl.com/ 1.Unicode与中文互转 16进制Unicode编码转换.还原   :http://www.msxindl.com/tools/uni ...

  3. Optim High Performance Unload [HPU]

    目录 一.简介 二.安装 三.基本配置 四.卸数 4.1. 命令行导出 4.2. 控制文件 4.2.1. 从表空间容器卸数 4.2.2. 从备份镜像中卸数 4.2.3. 控制文件语法参考 4.3. 存 ...

  4. 『无为则无心』Python基础 — 5、Python开发工具的安装与使用

    目录 1.Pycharm下载 2.Pycharm安装 3.PyCharm界面介绍 4.基本使用 (1)新建Python项目 (2)编写Python代码 (3)执行代码查看结果 (4)设置PyCharm ...

  5. 20201123 实验一《Python程序设计》实验报告

    20201123 2020-2021-2 <Python程序设计>实验一报告 课程:<Python程序设计> 班级:2011班 姓名:晏鹏捷 学号:20201123 实验教师: ...

  6. 精尽Spring Boot源码分析 - 支持外部 Tomcat 容器的实现

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  7. .net core 使用webservice

    开发环境在vs2017,2015 暂时没有试过 1.在扩展更新中添加Microsoft WCF Web Service Reference Provider 2.在core项目中添加链接的服务 3.键 ...

  8. nginx负载均衡与反向代理

    1.集群的特点 (1)高性能 (2)价格有效性 (3)可伸缩性 (4)高可用性 (5)透明性 2.负载均衡概述 负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡.分 ...

  9. Custom Controller CollectionQT样式自定义 001 :SliderLineEdit 滑动输入框

    主要是继承QLineEdit类重新实现其鼠标事件,建议禁用输入框默认的菜单项. SliderLineEdit 滑动输入框 参照图形平台 Adobe系列中属性输入框 做的样式,支持点击编辑和长按鼠标拖动 ...

  10. 45、django工程(URLconf)

    45.1.django URLconf 路由系统介绍: 1.说明: URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表, ...