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,打开添加如下配置:
步骤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
步骤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);
},
})
手机扫一扫
移动阅读更方便
你可能感兴趣的文章