Como interceptar todas as solicitações AJAX feitas por diferentes bibliotecas JS

Estou construindo um aplicativo Web com diferentes bibliotecas JS (AngularJS, OpenLayers, ...) e preciso de uma maneira de interceptar todas as respostas AJAX para poder, caso a sessão do usuário registrado expire (a resposta volta com401 Unauthorized status), para redirecioná-lo para a página de login.

Conheço as ofertas do AngularJSinterceptors para gerenciar esses cenários, mas não conseguiu encontrar uma maneira de obter essa injeção nas solicitações do OpenLayers. Então optei por uma abordagem JS de baunilha.

Aqui Encontrei este pedaço de código ...

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

... que eu adaptei e parece que ele se comporta conforme o esperado (testei apenas no último Google Chrome).

Como ele modifica o protótipo do XMLHTTPRequest, estou me perguntando o quão perigoso isso poderia resultar ou se poderia produzir sérios problemas de desempenho. E, a propósito, haveria uma alternativa válida?

Atualização: como interceptar solicitações antes de serem enviadas

O truque anterior funciona bem. Mas e se, no mesmo cenário, você quiser injetar alguns cabeçalhos antes que a solicitação seja enviada? Faça o seguinte:

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

questionAnswers(4)

yourAnswerToTheQuestion