2014-11-15 7 views
1

Я работаю над веб-приложением, где мне нужно получить доступ к элементам iFrame с помощью JavaScript. Для этого iFrame должен отправить в браузер обозреватель «Allow-Control-Allow-Origin: *».Firefox setResponseHeader не работает

К сожалению, этого не происходит, поэтому я использую расширение для изменения заголовков ответов, но по какой-то причине setResponseHeader не работает.

Это становится еще более запутанным, так как я использую setResponseHeader для разделения X-Frame-Options, но когда я настраиваю собственный заголовок, он просто не работает.

Я использую вкладку «Inspect Element» 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); 

Я пытался решить это в течение двух часов, поэтому любая помощь будет оценена. Благодарю.

ответ

1

Вы хотите добавить obserer для http-on-examine-response, с этим вы можете только getResponseHeader

изменить его http-on-modify-request. то вы можете setRequestHeader, вы не можете ответить getResponseHeader in на запрос изменения.

Это код лома, но он работал на меня:

 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); 
+0

Я не пытаюсь setRequestHeader, я пытаюсь setResponseHeader, на самом деле – TheNavigat

+0

@TheNavigator Мое предположение было бы то же самое, это может быть сделано на запрос изменения, так как впоследствии он уже установлен, попробуйте. Ошибка, которую вы получаете, когда пытаетесь 'setRequestHeader'' NS_ERROR_ILLEGAL_VALUE', если это правда, тогда я думаю, что мое предположение верно. – Noitidart

+1

Я получаю эту ошибку, когда устанавливаю responseHeader на http-on-modify-request. Однако есть что-то странное. Я попробовал другой фрагмент кода, и он работал, но по какой-то причине вкладка «Сеть» не отображает измененные заголовки. Но это работает. Это очень странно. – TheNavigat

Смежные вопросы