2012-04-18 84 views
0

我想生成一個PDF文件打印使用GeoExt地圖,但已遇到一個問題。在Chrome我得到的錯誤信息:GeoExt PDF打印:「錯誤消息:來源http:// localhost:55608是不允許的訪問控制允許來源」

XMLHttpRequest cannot load http://Howard:8080/geoserver/pdf/create.json. Origin http://localhost:55608 is not allowed by Access-Control-Allow-Origin. 

我認爲錯誤消息告訴我,它做的代理,所以我曾嘗試加入以下的Config.yaml但沒有運氣:

- !localMatch 
    dummy: true 
- !ipMatch 
    host: 0.0.0.0 
    mask: 0.0.0.0 

這應該允許所有本地IP地址和所有主機訪問Howard:8080中的create.json,但由於某種原因,我仍然收到錯誤消息。

但是,在Firefox上,我得到了一個非常不同的行爲。我沒有得到任何錯誤消息,但我最終觸發printexception一個錯誤信息「通訊故障

我堅持和的想法,誰能幫助

這裏是代碼:?

var printProvider = new GeoExt.data.PrintProvider({ 
       //method: "GET", // "POST" recommended for production use 
       method: "POST", // "POST" recommended for production use 

       //capabilities: g_printCapabilities, // provide url instead for lazy loading 

       url: OpenLayers.ProxyHost + "http://Howard:8080/geoserver/pdf/", 
       //url: "http://Howard:8080/geoserver/pdf/", 
       autoLoad: true, 

       customParams: { 
       mapTitle: "GeoExt Printing Demo", 
       comment: "This demo shows how to use GeoExt.PrintMapPanel with OSM" 
       } 
      }); 


var printPage = new GeoExt.data.PrintPage({ 
    printProvider: printProvider 
}); 

var mapPanel = new GeoExt.MapPanel({ 
    title: "Map", 
    region: "center", 
    height: 400, 
    width: 600, 
    map: map, 

    bbar: ["->", { 
     text: "Print", 
     handler: function() { 
      // convenient way to fit the print page to the visible map area 
      printPage.fit(mapPanel, true); 

      printProvider.print(mapPanel, printPage); 
     } 
    }] 
}); 

// create a panel and add the map panel and grid panel 
// inside it 
var mainPanel = new Ext.Panel({ 
    renderTo: "mainpanel", 
    layout: "border", 
    height: 800, 
    width: 600, 
    items: [mapPanel] 
}); 

編輯:

我在JavaScript中添加以下代碼:

var invocation = new XMLHttpRequest(); 
var url = 'http://Howard:8080/geoserver/pdf/create.json'; 

function callOtherDomain() { 
    if(invocation) {  
     invocation.open('POST', url, true); 
     invocation.onreadystatechange = function(){ 
      alert("invocation.onreadystatechange"); 
     } 
     invocation.send(); 
    } 
} 
callOtherDomain(); 

但我仍然收到錯誤消息。我是否在Howard服務器上添加Access-Control-Allow-Origin標頭?如果是這樣,我該怎麼做?

編輯2:

我已經添加在以下代碼後面:

Response.AddHeader("Access-Control-Allow-Origin", "*"); 
Response.AddHeader("Access-Control-Allow-Headers", "POST"); 
Response.AddHeader("Access-Control-Allow-Headers", "GET"); 

我也放入下列:的機器,這將在加入

<httpProtocol> 
    <customHeaders> 
    <add name="Access-Control-Allow-Origin" value="*" /> 
    </customHeaders> 

兩個碼塊在我的web.config文件中調用pdf文件,但仍然沒有運氣。

編輯3.

PDF文件似乎正確生成,如果我不包括任何矢量圖層。這適用於Firefox和Chrome。我有與IE瀏覽器分開的問題,所以不能在那裏測試它。

+0

您需要設置一個'Access-Control-Allow-Origin'標頭。 – SLaks 2012-04-18 16:10:46

+0

如何設置Access-Control-Allow-Origin標題? – user1341833 2012-04-23 08:27:23

+0

這取決於您的服務器 – SLaks 2012-04-23 12:36:10

回答

0

我使用代理服務器的方法當前原點內,並在客戶端,我只是重寫打印和創建URL:

"loadcapabilities": function() { 
        if (self.printProvider.capabilities.createURL.indexOf('url') === -1) { 
      self.printProvider.capabilities.createURL = GMARC.geoserverPrintProxy + '?url=' + encodeURIComponent(self.printProvider.capabilities.createURL); 
      self.printProvider.capabilities.printURL = GMARC.geoserverPrintProxy + '?url=' + encodeURIComponent(self.printProvider.capabilities.printURL); 
     } 
       }, 

在服務器端類似的東西上的Node.js:

url = 'http://geoserveripaddress:8080/geoserver/pdf/' + self.c.req.params.id; 
     var method = self.c.req.params.id === 'info.json' ? 'GET' : 'POST', params = {}; 
request(url, 
      { 
       auth: { 
        "user": username, 
        "password": password, 
        'sendImmediately': false 
       }, 
       method: method, 
       json: params 
      } 
     ).pipe(self.c.res); 
相關問題