OpenLayers跨域请求WFS服务在Tomcat环境下的实现

由于项目的地图数据放在不同的服务器上面,因此进行POI搜索和路径导航的时候需要进行跨域检索,容器环境用的是Tomcat 7.0.53.配置跨域请求的步骤为:

1. 下载Proxy.cgi,或者到Openlayers的安装目录中,安装盘符\OpenLayers-2.13.1\examples中查找,或者直接拷贝本文下面的代码到proxy.cgi文件中。并修改allowedHosts,添加需要访问的远程服务器地址:端口和本地IP地址:端口。最后把proxy.cgi文件放在CGI文件夹中,拷贝到网站WEB-INF目录下,如图所示

下面是proxy.cgi源码,其中192.168.1.18:8090‘,‘192.168.1.50:8080‘,‘192.168.1.49:8080‘,‘192.168.1.18:8080‘,‘localhost:8090‘是本文添加的远程服务器地址和本地地址。

#!/usr/bin/envpython

"""Thisis a blind proxy that we use to get around browser
restrictionsthat prevent the Javascript from loading pages not on the
sameserver as the Javascript.  This hasseveral problems: it's less
efficient,it might break some sites, and it's a security risk because
peoplecan use this proxy to browse the web and possibly do bad stuff
withit.  It only loads pages via http andhttps, but it can load any
contenttype. It supports GET and POST requests."""

importurllib2
importcgi
importsys, os

#Designed to prevent Open Proxy type stuff.

allowedHosts= ['www.openlayers.org', 'openlayers.org',
                'labs.metacarta.com','world.freemap.in',
                'prototype.openmnnd.org','geo.openplans.org',
                'sigma.openplans.org', 'demo.opengeo.org',
                'www.openstreetmap.org','sample.azavea.com',
                'v2.suite.opengeo.org','v-swe.uni-muenster.de:8080',
                'vmap0.tiles.osgeo.org','www.openrouteservice.org',
                'maps.wien.gv.at','192.168.1.18:8090','192.168.1.50:8080','192.168.1.49:8080','192.168.1.18:8080','localhost:8090']

method= os.environ["REQUEST_METHOD"]

ifmethod == "POST":
    qs = os.environ["QUERY_STRING"]
    d = cgi.parse_qs(qs)
    if d.has_key("url"):
        url = d["url"][0]
    else:
        url ="http://www.openlayers.org"
else:
    fs = cgi.FieldStorage()
    url = fs.getvalue('url',"http://www.openlayers.org")

try:
    host = url.split("/")[2]
    if allowedHosts and not host inallowedHosts:
        print "Status: 502 BadGateway"
        print "Content-Type:text/plain"
        print
        print "This proxy does not allowyou to access that location (%s)." % (host,)
        print
        print os.environ

    elif url.startswith("http://") orurl.startswith("https://"):

        if method == "POST":
            length =int(os.environ["CONTENT_LENGTH"])
            headers ={"Content-Type": os.environ["CONTENT_TYPE"]}
            body = sys.stdin.read(length)
            r = urllib2.Request(url, body,headers)
            y = urllib2.urlopen(r)
        else:
            y = urllib2.urlopen(url)

        # print content type header
        i = y.info()
        if i.has_key("Content-Type"):
            print "Content-Type: %s"% (i["Content-Type"])
        else:
            print "Content-Type:text/plain"
        print

        print y.read()

        y.close()
    else:
        print "Content-Type:text/plain"
        print
        print "Illegal request."

exceptException, E:
    print "Status: 500 UnexpectedError"
    print "Content-Type: text/plain"
    print
    print "Some unexpected error occurred.Error text was:", E

2. 修改tomcat配置文件web.xml,很多代码的该文件中是存在的,只不过是添加了注释,把注释去掉即可。修改如下

 <servlet>
        <servlet-name>cgi</servlet-name>
        <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
        <init-param>
          <param-name>debug</param-name>
          <param-value>0</param-value>
        </init-param>
        <init-param>
          <param-name>cgiPathPrefix</param-name>
          <param-value>WEB-INF/cgi</param-value>
        </init-param>
		<init-param>
			<param-name>executable</param-name>
			<param-value>C:/Python27/python.exe</param-value>
		</init-param>
		<init-param>
			<param-name>passShellEnvironment</param-name>
			<param-value>true</param-value>
		</init-param>
         <load-on-startup>5</load-on-startup>
    </servlet>

  <!-- ================ Built In Servlet Mappings ========================= -->

  <!-- The servlet mappings for the built in servlets defined above.  Note  -->
  <!-- that, by default, the CGI and SSI servlets are *not* mapped.  You    -->
  <!-- must uncomment these mappings (or add them to your application's own -->
  <!-- web.xml deployment descriptor) to enable these services              -->

    <!-- The mapping for the default servlet -->
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

	<servlet-mapping>
		<servlet-name>cgi</servlet-name>
		<url-pattern>/cgi/*</url-pattern>
	</servlet-mapping>

其中有一个节点要注意,该节点配置了Python的路径,如果电脑没有安装python需要安装,并且配置好路径。

<init-param>

<param-name>executable</param-name>

<param-value>C:/Python27/python.exe</param-value>

</init-param>

3. 修改tomcat配置目录中content.xml文件,在Content节点中添加privileged="true"属性。

<?xml version='1.0' encoding='utf-8'?>
<!--
  Licensed to the ApacheSoftware Foundation (ASF) under one or more
  contributor licenseagreements.  See the NOTICE filedistributed with
  this work for additionalinformation regarding copyright ownership.
  The ASF licenses thisfile to You under the Apache License, Version 2.0
  (the"License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

  Unless required byapplicable law or agreed to in writing, software
  distributed under theLicense is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES ORCONDITIONS OF ANY KIND, either express or implied.
  See the License for thespecific language governing permissions and
  limitations under theLicense.
-->
<!-- The contents of this file will be loaded for each webapplication -->
<Context privileged="true">

    <!-- Default set ofmonitored resources -->
   <WatchedResource>WEB-INF/web.xml</WatchedResource>

    <!-- Uncomment thisto disable session persistence across Tomcat restarts -->
    <!--
    <Managerpathname="" />
    -->

    <!-- Uncomment thisto enable Comet connection tacking (provides events
         on sessionexpiration as well as webapp lifecycle) -->
    <!--
    <ValveclassName="org.apache.catalina.valves.CometConnectionManagerValve"/>
    -->

</Context>

4. 配置完成,开始你的跨域访问吧。

时间: 2024-10-15 18:20:44

OpenLayers跨域请求WFS服务在Tomcat环境下的实现的相关文章

vue跨域的问题,在开发环境下

找到config文件夹下的index.js proxyTable: { '/api': { target: 'http://访问网址/', //设置调用接口域名和端口号别忘了加http changeOrigin: true,//允许跨域 pathRewrite: { '^/api': 'http://访问网址/' //这里理解成用'/api'代替target里面的地址,组件中我们调接口时直接用/api代替 // 比如我要调用'http://0.0:300/user/add',直接写'/api/u

jQuery jsonp跨域请求详解

跨域的安全限制都是对浏览器端来说的,服务器端是不存在跨域安全限制的. 浏览器的同源策略限制从一个源加载的文档或脚本与来自另一个源的资源进行交互. 如果协议,端口和主机对于两个页面是相同的,则两个页面具有相同的源,否则就是不同源的. 如果要在js里发起跨域请求,则要进行一些特殊处理了.或者,你可以把请求发到自己的服务端,再通过后台代码发起请求,再将数据返回前端. 这里讲下使用jquery的jsonp如何发起跨域请求及其原理. 先看下准备环境:两个端口不一样,构成跨域请求的条件. 获取数据:获取数据

原生JS实现Ajax的跨域请求

原生JS如何实现Ajax的跨域请求? 在解决这个问题之前,我们务必先清楚为什么我们要跨域请求,以及在什么情况下会跨域请求. 了解一下:"同源策略",你就知道了: 同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互.这是一个用于隔离潜在恶意文件的关键的安全机制. 它的定义是: 一段脚本向后台请求数据,只能读取属于同一协议名.同一主机名.同一端口号下的数据: 所以,请求不同协议名.不同端口号.不同主机名下面的文件时, 将会违背同源策略,无法请求成功,需要进行跨越处理!!

jQuery jsonp跨域请求

跨域的安全限制都是对浏览器端来说的,服务器端是不存在跨域安全限制的. 浏览器的同源策略限制从一个源加载的文档或脚本与来自另一个源的资源进行交互. 如果协议,端口和主机对于两个页面是相同的,则两个页面具有相同的源,否则就是不同源的. 如果要在js里发起跨域请求,则要进行一些特殊处理了.或者,你可以把请求发到自己的服务端,再通过后台代码发起请求,再将数据返回前端. 这里讲下使用jquery的jsonp如何发起跨域请求及其原理. 先看下准备环境:两个端口不一样,构成跨域请求的条件. 获取数据:获取数据

tomcat跨域请求

tomcat A请求tomcat B中的数据(本人是在同一台机器上2个tomcat端口不同,在不同机器上有时间会测得) 博主用的是ajax请求 在A 请求B中数据,用下面的方法可以 在被请求的tomcat B 应用的web.xml中加入如下代码: 在tomcat B 应用中加入如下jar: cors-filter-1.7.jar:  java-property-utils-1.9.jar <!-- tomcat跨域请求开始 --> <filter> <filter-name&

JQuery - Ajax和Tomcat跨域请求问题解决方法!

在JQuery里面使用Ajax和Tomcat服务器之间进行数据交互,遇到了跨域请求问题,无法成功得到想要的数据! 错误信息部分截图: 通过错误信息判断知道已经发生在Ajax跨域请求问题了! 当前Tomcat服务器,是一个已经存在的工程,有APP同这部分代码一同工作.我所做的是开发另外一款手机应用程序,并且使用已有的接口!在这种情况下,实现Ajax跨域请求,而且对目前源代码影响越小越好!怎样达到这样的目标?最终通过为Tomcat添加过滤器方式完成! 由于此项目是商业项目,服务器并不是我管理,所以无

PHP跨域请求nodejs

摘要:用nodejs作为服务器,php作为客服端进行跨域请求,并返回数据. 一:windows环境下的nodejs安装(以及express模板的安装):http://blog.uifanr.com/2013/03/12/472 http://www.veryhuo.com/a/view/39756.html 二:测试安装 1:在cmd中输入:node -v 若出现版本号,则安装成功. 2:在D 盘下新建一个文件  test_node.js : 1 var http = require("http

跨域请求,关于后端session会话丢失的解决办法

目前使用前后端分离的模式开发,后端提供跨域接口.前端jsonp调用,绑定数据,但是在该站点下有个人中心模块存在的情况下,服务端的session会话会被跨域请求覆盖改掉 大家都知道tomcat使用cookie中jsessionid来区分客户端session会话 跨域请求接口恰恰有时候响应回来回改变该站点下的jsessionid值,导致服务器每次判断都是一个新的会话 以网站个人中心模块来说,每一个跨域jsonp请求,都会Response 一个cookie值,SET-COOKIE:JSESSIONID

springboot跨域请求

首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 SpringBoot | 番外:使用小技巧合集 2018/09/17 | 分类: 基础技术 | 0 条评论 | 标签: spring boot 分享到: 原文出处: oKong 前言 最近工作比较忙,事情也比较多.加班回到家都十点多了,洗个澡就想睡觉了.所以为了不断更太多天,偷懒写个小技巧合集吧.之后有时间都会进行文章更新的.原创不易,码字不易,还希望大家多多支持!话不多说,开始今天的技巧合集吧~ 设置网站图标 原