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-12-21 21:03:51

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

JS postMessage跨域请求解决方案

    今天看到一篇非常好的文章,忍不住想转载过来,亲自测试了一下,解决了web开发中我们经常遇到最头痛的跨域请求的问题.文章主要是介绍了HTML5 postMessage 和 onmessage API 详细应用,比较长,我只截取了跨域请求解决方案的一部分,想查看全文的人可以去查看原文.   Cross-document messaging 简介 由于同源策略的限制,JavaScript 跨域的问题,一直是一个颇为棘手的问题.HTML5 提供了在网页文档之间互相接收与发送信息的功能.使用这个功

利用JSONP实现跨域请求

前言:有时候一忙起来就没了时间观念,原来我已经有十多天没写博客了.一直想做跨域方面的尝试,无奈最近准备校招没时间动动手.今天就先讲讲JSONP吧,昨晚还在研究QQ空间日志里面网络图片的问题呢,我发现日志还提供了HTML模式,我们可以利用img标签的src属性实现跨域请求,从自己的服务器里提取动态内容. JSONP 在讲实现之前,我们先来看看何为JSONP.以下是维基百科的解释: JSONP or "JSON with padding" is a communication techni

JavaScript跨域请求RESTful Web Service

当我们用js请求RESTful Web Service的时候,通常会出现跨域无法访问的问题,也就是无法正常得到我们要的值.jsonp是个解决问题的方法.但是,我们希望访问RESTful Web Service就像一般的ajax方法一样,不用每个都去搞一个jsonp和callback.这就需要我们在服务端进行一些设置,下面我用一个简单的 Filter来进行说明,其他比较复杂的情况根据自己的需求进行改动. import java.io.IOException; import javax.servle

ASP.NET开发web应用过程中遇到的javascript跨域请求问题

解决方案 不提倡跨域的post请求. 0.jquery中ajax的跨域方案jsonp .ashx代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace KB.DSN.Web.API.Tokens { /// <summary> /// Summary description for Get /// </summary> public class

$.getJSON()跨域请求简介

以前总是没搞明白是怎么回事,现在是迫不得已,就仔细看了看说明文档,终于测试成功了,记下: 1,同一域名下和其他的请求可以是一样的 js: var url="http://localhost:2589/a.ashx"; $(function(){ $.getJSON(url,function(data){ alert (data.Name); }) }); 服务器返回字符串: {"Name":"loogn","Age":23}

js跨域请求的5中解决方式

这篇文章主要介绍了js跨域请求的5中解决方式的相关资料,需要的朋友可以参考下     跨域请求数据解决方案主要有如下解决方法: ? 1 2 3 4 5 JSONP方式 表单POST方式 服务器代理 Html5的XDomainRequest Flash request 分开说明: 一.JSONP: 直观的理解: 就是在客户端动态注册一个函数 function a(data),然后将函数名传到服务器,服务器返回一个a({/*json*/})到客户端运行,这样就调用客户端的 function a(da

jquery+ajax实现跨域请求的方法

 这篇文章主要介绍了jquery+ajax实现跨域请求的方法,详细介绍了前台及后台的处理方法,是非常实用的技巧,需要的朋友可以参考下     本文实例讲述了jquery+ajax实现跨域请求的方法.分享给大家供大家参考.具体实现方法如下: 说明:这里的dataType 为 "jsonp" :type 只能为 GET 前台请求代码如下: 代码如下: $.ajax({ type: "GET", url: "http://www.xxx.com/Rest/Val

jquery跨域请求示例分享

 这篇文章主要介绍了jquery跨域请求示例(jquery发送ajax请求),需要的朋友可以参考下 jQuery中常用getJSON来调用并获取远程的JSON字符串,将其转换为JSON对象,如果成功,则执行回调函数.原型如下:   jQuery.getJSON( url, [data], [callback] ) 跨域加载JSON数据.   url: 发送请求的地址 data : (可选) 待发送key/value参数 callback: (可选) 载入成功时的回调函数 主要用于客户端获取服务器

Access-Control-Allow-Headers 跨域请求中参数的意义?

问题描述 Access-Control-Allow-Headers 跨域请求中参数的意义? response.addHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With"); Access-