다른 JS 라이브러리에서 만든 모든 AJAX 요청을 가로채는 방법
다른 JS 라이브러리 (AngularJS, OpenLayers, ...)를 사용하여 웹 앱을 구축 중이며 로깅 된 사용자 세션이 종료 된 경우 (응답이 401 Unauthorized
상태로 돌아옴) 모든 AJAX 응답을 가로 챌 수있는 방법이 필요합니다. 로그인 페이지로 이동합니다.
AngularJS가 interceptors
시나리오를 관리 할 수 있는 것을 알고 싶습니다. 그래서 저는 바닐라 JS 접근 방식을 선택했습니다.
(function(open) {
XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
this.addEventListener("readystatechange", function() {
console.log(this.readyState); // this one I changed
}, false);
open.call(this, method, url, async, user, pass);
};
})(XMLHttpRequest.prototype.open);
... 내가 적응하고 예상대로 작동하는 것처럼 (마지막 Google 크롬에서만 테스트했습니다).
XMLHTTPRequest의 준비가 얼마나 위험한지 또는 심각한 성능 문제가 있는지 수 있습니다. 그런데 유효한 대안이 있습니까?
업데이트 : 요청이 전송되기 전에 가로채는 방법
이전 트릭은 작동합니다. 구매하기 전에 구매 요청이 전송되기 전에 구매해야합니까? 다음을 수행하십시오.
(function(send) {
XMLHttpRequest.prototype.send = function(data) {
// in this case I'm injecting an access token (eg. accessToken) in the request headers before it gets sent
if(accessToken) this.setRequestHeader('x-access-token', accessToken);
send.call(this, data);
};
})(XMLHttpRequest.prototype.send);
성능 유형의 함수 후킹은 완벽하게 안전하며 다른 방법에서 수행됩니다.
그리고 성능에 사용되는 유일한 영향은 실제로 호출 .open()
하지 않는 호출 코드를 직접 실행하는 것입니다.
IE에서 ActiveXObject
Ajax를 수행 하는 제어 방법 을 사용하려는 코드를 사용 합니다. 작성된 코드는 잘 먼저 XMLHttpRequest
개체를 찾아서 사용할 수 있고 IE 7 사용할 수있는부터 ActiveXObject
경우이를 사용합니다. 그러나 사용 가능한 경우 메소드 를 사용하는 코드가 훨씬 훨씬 더 최신 버전의 IE를 통해 적용됩니다.
최신 브라우저에서는 fetch()
인터페이스 와 같은 Ajax 호출을 발행하는 다른 방법이 있으므로 모든 Ajax 호출을 후크하려는 경우 XMLHttpRequest
.
일부 버전의 IE (9 이하) 에서는 XMLHttpRequests를 사용할 수 없습니다 . 라이브러리에 따라 IE의 독점 ActiveX 컨트롤을 먼저 사용할 수 있습니다.
물론 IE에서 엄격하지 않은 DOCTYPE을 사용하는 경우 모든 것입니다.
참조 : CanIuse
Firefox AMO Editor가 친절하게 지적했듯이 Rob W
,
다음 코드는 XMLHttpRequest의 동작을 변경합니다. 기본적으로 세 번째 ( "async") 매개 변수가 지정되지 않은 경우는 true입니다. 지정되고 정의되지 않은 경우 동기 HTTP 요청에서 요청을 전환하는 "false"와 동일합니다. 이로 인해 요청이 처리되는 동안 UI가 차단되고 XMLHttpRequest API의 일부 기능도 비활성화됩니다.
...
이 문제를 해결하려는 경우 open.call (....)을 open.apply (this, arguments);
다음은 참조 링크입니다.
'IT' 카테고리의 다른 글
iOS 8.1 시뮬레이터 현지화 중단 (NSLocalizedString) (0) | 2020.08.15 |
---|---|
오프라인 웹 애플리케이션 용 이미지 데이터 저장 (클라이언트 스토리지 측량 데이터베이스) (0) | 2020.08.15 |
호출 된 개체와 클라이언트의 연결이 더 이상 발생하지 않습니다. (0) | 2020.08.15 |
F # 및 C # 모두에서 사용할 F # 라이브러리를 디자인하는 가장 좋은 방법 (0) | 2020.08.15 |
Xcode 6 크기 클래스의 사용자 정의 글꼴 크기 조정이 사용자 정의 글꼴에서 작동하지 않음 (0) | 2020.08.15 |