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,打开添加如下配置:

  1. <filter>
  2. <filter-name>cross-origin</filter-name>
  3. <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
  4. <init-param>
  5. <param-name>allowedOrigins</param-name>
  6. <param-value>*</param-value>
  7. </init-param>
  8. <init-param>
  9. <param-name>allowedMethods</param-name>
  10. <param-value>GET,POST,OPTIONS</param-value>
  11. </init-param>
  12. <init-param>
  13. <param-name>allowedHeaders</param-name>
  14. <param-value>x-requested-with,content-type,access-control-allow-origin,access-control-allow-methods,authorization,accept</param-value>
  15. </init-param>
  16. </filter>
  1. <filter-mapping>
  2. <filter-name>cross-origin</filter-name>
  3. <url-pattern>/*</url-pattern>
  4. </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代码

  1.        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";
  2. $.ajax({
  3. type: "get",
  4. url: url,
  5. success: function(response){
  6. console.log(response);
  7. },
  8. error:function(XMLHttpRequest, textStatus, errorThrown) {
  9. alert(XMLHttpRequest.status);
  10. alert(XMLHttpRequest.readyState);
  11. alert(textStatus+";"+errorThrown);
  12. },
  13. })

  

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

步骤1. web.xml配置

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

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

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

  1. <filter-mapping>
  2. <filter-name>CorsFilter</filter-name>
  3. <url-pattern>/*</url-pattern>
  4. </filter-mapping>

  

步骤2. ajax代码

  1. url='http://10.0.30.63:8093/geoserver/rest/fonts.json';
  2.  
  3. $.ajax({
  4. type: "get",
  5. url: url,
  6. headers: {
  7. Authorization:"Basic YWRtaW46Z2Vvc2VydmVy",
  8. },
  9. //对于用户名密码验证,headers中Authorization项必须有,其值为加密后的“用户名:密码”,可以换成下面beforeSend的写法(两种不同的设置http请求头的方式)
  10. // beforeSend:function(xhr){
  11. // xhr.setRequestHeader ("Authorization","Basic YWRtaW46Z2Vvc2VydmVy");
  12. // },
  13.  
  14. dataType: "json",
  15. success: function(response){
  16. console.log(response);
  17. },
  18. error:function(XMLHttpRequest, textStatus, errorThrown) {
  19. alert(XMLHttpRequest.status);
  20. alert(XMLHttpRequest.readyState);
  21. alert(textStatus+";"+errorThrown);
  22. },
  23. })

  

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. springmvc——CharacterEncodingFilter过滤器要放在所有过滤器前面

    CharacterEncodingFilter的拦截顺序必须是第一个,否则还是会出现乱码问题.这是因为 request对象的parameter并不是一开始就解析的,它是等你第一次调用getParame ...

  2. 五、SELinux安全防护

    rwx 针对用户和组   SELinux  针对程序 targeted:定义网络程序规则   minimum:限制少量软件   mls:限制全部,没定义的全拒绝 [root@proxy ~]# vim ...

  3. 基于Typescript的Vue项目配置国际化

    基于Typescript的Vue项目配置国际化 简介 使用vue-i18n插件对基于Typescript的vue项目配置国际化,切换多种语言, 配合element-ui或者其他UI库 本文以配置中英文 ...

  4. 『无为则无心』Python基础 — 4、Python代码常用调试工具

    目录 1.Python的交互模式 2.IDLE工具使用说明 3.Sublime3工具的安装与配置 (1)Sublime3的安装 (2)Sublime3的配置 4.使用Sublime编写并调试Pytho ...

  5. 向虚拟机注册钩子,实现Bean对象的初始化和销毁方法

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 有什么方式,能给代码留条活路? 有人说:人人都是产品经理,那你知道吗,人人也都可以是 ...

  6. AS打包签名

    1.进入项目,然后点击菜单栏的Build  -->Generate  Signed APK... (如下图所示) 2.点击之后会出现下图,我这个是我以前有过KEY了,如果你以前没有过的话,都是空 ...

  7. 使用Spring Data JPA 访问 Mysql 数据库-配置项

    jpa操作数据库 注意:数据库采用的是本机数据库,下面是建表语句及初始化数据: SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------- ...

  8. Python-统计目录(文件夹)中Excel文件个数和数据量

    背景:前一阵子在帮客户做Excel文件中的数据处理,但是每周提交周报,领导都需要统计从客户接收的文件数量以及记录数.所以我就简单写了统计的脚本,方便统计目录(文件夹)中的Excel文件个数和数据量. ...

  9. WEB安全新玩法 [6] 防范图形验证码重复使用

    在完成关键业务操作时,要求用户输入图形验证码是防范自动化攻击的一种措施.为安全起见,即使针对同一用户,在重新输入信息时也应该更新图形验证码.iFlow 业务安全加固平台可以加强这方面的处理. 某网站系 ...

  10. 通过UnityWebRequest得到的纹理转精灵

    private IEnumerator GetImage(string url, Image fileImage) { UnityWebRequest WebRequest = new UnityWe ...