Printing GeoExt PDF打印:";错误消息:源http://localhost:55608 “访问控制允许来源”不允许;
我正在尝试生成一个pdf文件,以便使用GeoExt打印地图,但遇到了一个问题。在Chrome上,我收到错误消息:Printing GeoExt PDF打印:";错误消息:源http://localhost:55608 “访问控制允许来源”不允许;,printing,openlayers,geoserver,print-module,Printing,Openlayers,Geoserver,Print Module,我正在尝试生成一个pdf文件,以便使用GeoExt打印地图,但遇到了一个问题。在Chrome上,我收到错误消息: XMLHttpRequest cannot load http://Howard:8080/geoserver/pdf/create.json. Origin http://localhost:55608 is not allowed by Access-Control-Allow-Origin. 我认为错误消息告诉我这与代理有关,因此我尝试将以下内容添加到Config.yaml中
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有单独的问题,因此无法在那里进行测试。我在当前源服务器上使用代理方法,在客户端,我只是重写打印和创建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);
您需要设置一个
Access Control Allow Origin
标头。如何设置Access Control Allow Origin标头?我可以使用proxy.ashx从Howard server检索功能。但是从Howard server创建pdf地图打印时,我需要定义一个Access Control Allow Origin?我已尝试允许config.yaml文件中的任何主机,但没有成功。您需要配置HTTP头。所有正在运行的主机只会告诉它要响应的主机:
请求。响应头包含访问控制允许源:*这意味着它应该让所有主机访问资源PDF打印文件。我仍然停留在配置HTTP头的位置。我想您的意思是response.AddHeader()?如果是这样的话,我已经将它添加到我的代码中,但仍然没有运气。