2012-04-18 48 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); 
相关问题