posts - 41,  comments - 90,  trackbacks - 0
          openlayers是一個純javascript的web地圖客戶端框架,對開發(fā)平臺的適應性非常強,可以很容易的嵌入靜態(tài)http頁面、asp頁面、.net頁面、jsp頁面、j2ee頁面。由于openlayers采用AJAX架構,當?shù)貓D服務器與web客戶端服務器不同時,WMS中的getFeatureInfo,以及所有WFS功能接口不能正常工作。原因是各種瀏覽器禁止跨域訪問xml,解決的辦法很簡單,使用代理(Proxy)。

          根據(jù)應用系統(tǒng)架構的不同,代理的實現(xiàn)方式有很多種,包括web服務器內(nèi)置代理(如Apache)、cgi方式代理、php代理、jsp代理、aspx代理等。
          openlayers官方提供了一個采用python編寫的cgi代理,推薦在Apache2.2下使用。

          openlayers官方代理安裝步驟:
          1、安裝Python2.5,記住安裝路徑。
          2、將openlayers官方提供的proxy.cgi復制到apache的cgi-bin目錄下。
          修改第一行Python25的安裝路徑,注意不要去掉最前面的#號。
          修改allowedHosts中的geoserver/mapserver ip:geoserver/mapserver port部分。
          3、打開conf目錄下的httpd.conf文件,修改cgi部分,例如:
          <Directory "C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin">
              AllowOverride None
              Options ExecCGI
              Order allow,deny
              Allow from all
          </Directory>
          AddHandler cgi-script .cgi .py
          保存后重新啟動Apache,在瀏覽器地址欄中填入http://apache ip/cgi-bin/proxy.cgi,測試代理是否工作正常。

          以下是proxy.cgi的內(nèi)容:
          #!C:\Python25\python.exe
          # -*- coding: utf-8 -*-

          import urllib2
          import cgi
          import sys, os

          # Designed to prevent Open Proxy type stuff.

          allowedHosts = ['geoserver/mapserver ip:geoserver/mapserver port',
                                          'www.openlayers.org',
                                          'openlayers.org']

          method = os.environ["REQUEST_METHOD"]

          if method == "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 in allowedHosts:
                  print "Status: 502 Bad Gateway"
                  print "Content-Type: text/plain"
                  print
                  print "This proxy does not allow you to access that location (%s)." % (host,)
                  print
                  print os.environ
           
              elif url.startswith("http://") or url.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."

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

          備注:部署在同一個機器、不同服務器上(相同ip,不同端口號)同樣是跨域訪問。例如地圖服務器geoserver在tomcat,端口8080,應用系統(tǒng)在Apache或IIS,端口80),這種情況下只有IE6能夠正常訪問,條件是將ip地址加入可信站點列表,IE7、IE8、FF3.6都會禁止訪問。


          posted on 2010-08-26 10:36 天狼 閱讀(4120) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 大方县| 蒙自县| 封开县| 盖州市| 兴国县| 松桃| 霍林郭勒市| 晋宁县| 龙泉市| 德格县| 铁岭市| 保靖县| 大英县| 灵石县| 清徐县| 铁岭县| 竹北市| 建平县| 稷山县| 微博| 叶城县| 马龙县| 义马市| 寿光市| 江阴市| 云和县| 永仁县| 正安县| 汶上县| 新竹县| 东海县| 普定县| 镶黄旗| 临武县| 鄱阳县| 南江县| 宝坻区| 霍林郭勒市| 长沙县| 福海县| 潢川县|