【问题标题】:Firefox setResponseHeader isn't workingFirefox setResponseHeader 不起作用
【发布时间】: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


    【解决方案1】:

    你正在为http-on-examine-response添加观察者,这样你就只能getResponseHeader

    将其更改为http-on-modify-request。那么你可以setRequestHeader,但是你不能getResponseHeader在修改请求中。

    这是废代码,但它对我有用:

            observe : function(aSubject, aTopic, aData) {
                // Make sure it is our connection first.
                if (aSubject == channel) {
                    //this is our channel
                    //alert('is my mine');
                    cdxFire.myChannel = aSubject.QueryInterface(Components.interfaces.nsIHttpChannel);
                    if (cdxFire.myChannel.requestMethod == 'GET')   {
                        //alert('its a get so need to removeObserver now');
                        //cdxFire.observerService.removeObserver(modHeaderListener, "http-on-modify-request");
                    }
                    if (aTopic == 'http-on-modify-request' && cdxFire.myChannel.requestMethod == 'POST') {
                        //can set headers here including cookie
                        try {
                                var xContentLength = httpChannel.getRequestHeader('Content-Length');
                                var xContentType = httpChannel.getRequestHeader('Content-Type');
                                //alert('content length is there so change it up');
                                cdxFire.myChannel.setRequestHeader('Content-Type','',false);
                                cdxFire.myChannel.setRequestHeader('Content-Type',xContentType,false);
                                cdxFire.myChannel.setRequestHeader('Content-Length','',false);
                                cdxFire.myChannel.setRequestHeader('Content-Length',xContentLength,false);
    

    【讨论】:

    • 我不是要setRequestHeader,我是要setResponseHeader,其实
    • @TheNavigator 我的猜测是一样的,它可以在修改请求时完成,因为它已经设置好了,试试看。当您尝试 setRequestHeader NS_ERROR_ILLEGAL_VALUE 时会出现错误吗?如果那是真的,那么我认为我的猜测是正确的。
    • 在 http-on-modify-request 上设置 responseHeader 时出现该错误。不过有一点很奇怪。我尝试了其他一些 sn-p 代码并且它工作但由于某种原因“网络”选项卡不会显示修改后的标题。但它有效。这太奇怪了。
    • 哦,感谢您的注意。所以 setReponseHeader 只适用,所以你能确认一下吗:on-examine-response only
    • 实际上它起作用了 :) “不过有一些奇怪的东西。我尝试了一些其他的 sn-p 代码并且它工作但由于某种原因“网络”选项卡不会显示修改后的标题。但它可以工作。这太奇怪了。”
    猜你喜欢
    • 2013-07-24
    • 2013-12-09
    • 2012-08-19
    • 2011-08-18
    • 2017-11-12
    • 1970-01-01
    • 2012-11-27
    • 2013-09-23
    • 2012-02-27
    相关资源
    最近更新 更多