【发布时间】:2014-11-15 13:17:22
【问题描述】:
我正在开发一个需要使用 JavaScript 访问 iFrame 元素的 Web 应用程序。为此,iFrame 必须向浏览器发送“Allow-Control-Allow-Origin: *”标头。
不幸的是,这没有发生,这就是我使用扩展来修改响应标头的原因,但由于某种原因,setResponseHeader 不起作用。
因为我使用 setResponseHeader 来剥离 X-Frame-Options,所以它变得更加混乱,但是当我设置自定义标题时,它就不起作用了。
我正在使用 Firefox 的“检查元素”的网络选项卡来观察请求,虽然它显示请求标头设置正确,但它不显示响应标头。
这就是我设置请求和响应标头的方式。
var chrome = require("chrome");
chrome.Cc["@mozilla.org/observer-service;1"].getService( chrome.Ci.nsIObserverService ).addObserver({
observe : function(subject, topic, data) {
var channel = subject.QueryInterface( chrome.Ci.nsIHttpChannel );
channel.setRequestHeader("x-mysite-extended", "somedata", false);
}
},"http-on-modify-request",false);
chrome.Cc["@mozilla.org/observer-service;1"].getService( chrome.Ci.nsIObserverService ).addObserver({
observe : function(subject, topic, data) {
var channel = subject.QueryInterface( chrome.Ci.nsIHttpChannel );
channel.setResponseHeader("x-mysite-extended", "somedata", false);
}
},"http-on-examine-response",false);
同样,请求标头根据“网络”选项卡工作。我尝试使用 http-on-modify-request 来设置响应头,但效果不佳。
这就是我剥离 X-Frame-Options 标头的方式,它有效。
let myListener =
{
observe : function (aSubject, aTopic, aData)
{
console.log(aTopic);
if (aTopic == "http-on-examine-response")
{
let channel = aSubject.QueryInterface(Ci.nsIHttpChannel);
try
{ // getResponseHeader will throw if the header isn't set
let hasXFO = channel.getResponseHeader('X-Frame-Options');
if (hasXFO)
{
// Header found, disable it
channel.setResponseHeader('X-Frame-Options', '', false);
}
}
catch (e) {}
}
}
}
var observerService = Cc["@mozilla.org/observer-service;1"]
.getService(Ci.nsIObserverService);
observerService.addObserver(myListener, "http-on-examine-response", false);
我已经尝试了两个小时来解决这个问题,因此我们不胜感激。谢谢。
【问题讨论】:
标签: http-headers firefox-addon