programing

XMLHttpRequest.open()을(를) 재정의합니다.

javamemo 2023. 7. 29. 08:05
반응형

XMLHttpRequest.open()을(를) 재정의합니다.

제가 어떻게 해야만 이 문제를 해결할 수 있을까요?XMLHttpRequest.open()그 다음에 그것의 주장을 잡고 변경하는 방법?

프록시 방법을 이미 시도했지만 작동하지 않았습니다. 다음과 같은 경우 열린 오버라이드를 제거했습니다.XMLHttpRequest()호출됨:

(function() {
    var proxied = window.XMLHttpRequest.open;
    window.XMLHttpRequest.open = function() {
        $('.log').html(arguments[0]);
        return proxied.apply(this, arguments);
    };
})();

다음을 수정하지 않습니다.open에 의해 상속된 방법XMLHttpRequest objects하지만 방법을 추가하는 것뿐입니다.XMLHttpRequest constructor실제로는 사용되지 않는 것입니다.

저는 페이스북에서 이 코드를 시도했고 요청을 받을 수 있었습니다.

(function() {
    var proxied = window.XMLHttpRequest.prototype.open;
    window.XMLHttpRequest.prototype.open = function() {
        console.log( arguments );
        return proxied.apply(this, [].slice.call(arguments));
    };
})();

/*
    ["POST", "/ajax/chat/buddy_list.php?__a=1", true]
    ["POST", "/ajax/apps/usage_update.php?__a=1", true]
    ["POST", "/ajax/chat/buddy_list.php?__a=1", true]
    ["POST", "/ajax/canvas_ticker.php?__a=1", true]
    ["POST", "/ajax/canvas_ticker.php?__a=1", true]
    ["POST", "/ajax/chat/buddy_list.php?__a=1", true]
*/

그래서 네, 오픈 메소드를 추가해야 합니다.XMLHttpRequest prototype(계속).XMLHttpRequest.prototype)가 아닙니다.XMLHttpRequest constructor(계속).XMLHttpRequest)

제가 하고 싶은 접근법이 있습니다. XHR 원숭이 패치의 어둠의 예술을 마스터하는 것은 일종의 예술 형태입니다.

모든 키트와 카보들을 IIIF로 포장합니다.다음과 같은 것으로 시작합니다.

(function(open, send) {
    //...overrides of the XHR open and send methods are now encapsulated within a closure
})(XMLHttpRequest.prototype.open, XMLHttpRequest.prototype.send)

이 일반적인 접근 방식을 사용하여 모든 메소드를 재정의할 수 있지만 위의 비계는 하나의 깔끔한 유틸리티 기능에서 XMLHttpRequest의 열기 및 보내기 메소드를 모두 재정의하는 방법(원숭이 패치)을 설정합니다.(API의 프로토타입 객체에서) "기본" 메서드가 IIF에 공급되고 var의 "열림" 및 "보내기"에 할당되며 기능 블록에 안전하게 범위가 지정되는 방식에 주목합니다.

이제 배짱과 무엇이 당신의 원숭이 패치를 지속시킬 수 있는 열쇠인지에 대해 말씀드리겠습니다.자, 이것이 제가 하는 방식이고, 작동합니다.

일반적인 패턴은 다음과 같습니다.

방법 및 해당 인수(전체 서명, 사양/문서별)를 복제합니다.

모드에서 미끄러지고, 그리고.

모드를 XHR 프로토타입 속성에 적용하여 모든 XHR 요청이 코드를 통과하도록 합니다.

예를 들어 "열림"은 다음과 같습니다.

XMLHttpRequest.prototype.open = function(method, url, async, user, password) {
      xhrOpenRequestUrl = url;     // update request url, closure variable
      open.apply(this, arguments); // reset/reapply original open method
};

xhrOpenRequestUrl = url; line에 걸리지 마십시오. 이 코드는 나중에 처리하기 위해 URL이 필요했던 예제에서 복사한 것입니다.핵심 테이크어웨이는 "open.apply"입니다. "apply" 방법이나 "arguments" 개체에 익숙하지 않은 경우 XHR 열기 방법으로 조정을 강화합니다. 지금이 바로 그들이 무엇을 하는지 배울 수 있는 좋은 시간입니다.

마찬가지로 "보내기" 방법도...

XMLHttpRequest.prototype.send = function(data) {
  //...what ever code you need, i.e. capture response, etc.
  if (this.readyState == 4 && this.status >= 200 && this.status < 300) {
    xhrSendResponseUrl = this.responseURL;
    responseData = this.data;  // now you have the data, JSON or whatever, hehehe!
  }
  send.apply(this, arguments); // reset/reapply original send method
}

다시 말하지만, "적용"은 매우 중요하며 모든 재지정 후에 수행해야 합니다.그래서 지금 이 모든 것을 종합하면,

(function(open, send) {

   // Closure/state var's
   var xhrOpenRequestUrl;  // captured in open override/monkey patch
   var xhrSendResponseUrl; // captured in send override/monkey patch
   var responseData;       // captured in send override/monkey patch

   //...overrides of the XHR open and send methods are now encapsulated within a closure

   XMLHttpRequest.prototype.open = function(method, url, async, user, password) {
      xhrOpenRequestUrl = url;     // update request url, closure variable
      open.apply(this, arguments); // reset/reapply original open method
   };

   XMLHttpRequest.prototype.send = function(data) {

      //...what ever code you need, i.e. capture response, etc.
      if (this.readyState == 4 && this.status >= 200 && this.status < 300) {
         xhrSendResponseUrl = this.responseURL;
         responseData = this.data;  // now you have the data, JSON or whatever, hehehe!
      }
      send.apply(this, arguments); // reset/reapply original send method
   }

})(XMLHttpRequest.prototype.open, XMLHttpRequest.prototype.send)

아 그리고 마지막으로, 당신의 원숭이 패치는, 차례로, 원숭이 패치가 될 수 있습니다!이러한 가능성을 최소화하려면 IIF 코드가 페이지의 다른 모든 JS 뒤에 와야 합니다.적어도 당신이 목표로 할 수 있는 AJAX 호출 전에 XHR과 장난칠 수 있는 모든 JS.또한 마찬가지로, XHR 원숭이 패치는 Chrome 또는 Web Extension을 통해 주입될 수 있으며, 재정의도 무시할 수 있습니다!하!

도움이 되길 바랍니다!

구글 코드에서 xmlhttprequest 프로젝트를 확인해 보겠습니다.XMLHttpRequest 개체를 제대로 재정의하는 좋은 예입니다.출처는 여기에서 확인할 수 있습니다.

대신 XMLHttpRequest.prototype.open을 사용합니다.

언급URL : https://stackoverflow.com/questions/7775767/overriding-xmlhttprequest-open

반응형