2014-11-15 3 views
1

JavaScript를 사용하여 iFrame의 요소에 액세스해야하는 웹 응용 프로그램에서 작업하고 있습니다. 이를 위해 iFrame은 브라우저에 "Allow-Control-Allow-Origin : *"헤더를 보내야합니다.Firefox setResponseHeader가 작동하지 않습니다.

불행하게도 이것은 내가 응답 헤더를 수정하려면 확장을 사용하고 있는데 그 이유는, 발생하지 않지만, 어떤 이유로, setResponseHeader이 작동하지 않습니다.

그것은 내가 X-프레임-옵션을 제거하는 setResponseHeader을 사용하고,하지만 사용자 정의 헤더를 설정하고있을 때, 그냥 작동하지 않습니다 훨씬 더 복잡하기 때문에 가져옵니다. 내가 요청을 관찰 할 수의 네트워크 탭 "요소 검사"하고 요청 헤더가 올바르게 설정되어 표시하면서, 그것은 응답 헤더를 표시하지 않습니다 파이어 폭스를 사용하고

. 내가 요청 및 응답 헤더를 설정하고있어 방법

.

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-프레임 - 옵션 헤더의 제거 해요 방법

는 그입니다.

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

저는 지금 2 시간 동안이 문제를 해결하려고 노력해 왔기 때문에 어떤 도움을 주시면 감사하겠습니다. 감사.

답변

1

당신이 그것을 http-on-modify-request에 당신이 할 수있는 유일한 getResponseHeader

변화, http-on-examine-response에 대한 obserer를 추가하고 있습니다. 그 후에 할 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); 
+0

내가 setRequestHeader를하려고 아니에요, 나는 실제로 setResponseHeader에 – TheNavigat

+0

을 시도하고 @TheNavigator 내 생각은 같은 것, 그것은 수행 할 수 있습니다 수정 요청시, 이후에 이미 설정되어 있으므로 시도해보십시오. 'setRequestHeader''NS_ERROR_ILLEGAL_VALUE'를 시도 할 때 오류가 발생합니다. 그렇다면 내 추측이 맞다고 생각합니다. – Noitidart

+1

http-on-modify-request에서 responseHeader를 설정할 때 그 오류가 발생합니다. 뭔가 이상한 것이 있습니다. 다른 코드 스 니펫을 시도했지만 제대로 작동했지만 네트워크 탭에 수정 된 헤더가 표시되지 않습니다. 그러나 그것은 효과적이다. 그것은 매우 이상합니다. – TheNavigat

관련 문제