Angular обновить браузер при перенаправлении

При запуске приложения angularjs доступ пользователя может быть отозван со стороны сервера. В этом случае каждый запрос приводит к перенаправлению http 302 и html-странице входа (без частичной). Поскольку angular действительно ожидает того, что он запрашивал, в случае, если доступ все равно будет предоставлен, он ломается, поскольку может ожидать строку json, но получает страницу входа в систему html.

Есть ли что-нибудь, что я могу сделать, поймать это событие (прослушать перенаправления, выяснить, возвращается ли html и т. д.) и выполнить «жесткое» обновление URL-адреса перенаправления?


person orange    schedule 09.04.2015    source источник


Ответы (2)


Если я правильно понял, вы говорите о службе $http от AngularJS.

Если это так, вы можете преобразовать ответ самостоятельно и проверить, действителен ли он JSON следующим образом:

$http({
    url: '...',
    method: 'GET',
    transformResponse: function (reponse) {
        var ret = [];//if the return stays empty, the repsonse may be HTML
        try {
            ret = JSON.parse(reponse);
        } catch (error) {
            //here you could check for the error
        }
        return ret;
    }
}).success(function(answer){
    if(answer.length === 0){//its empty, so its probably HTML
        $window.location.reload();//refresh page here
        return;
    }
    //its JSON with content!
});
person Nano    schedule 09.04.2015
comment
Я только что нашел ответ после публикации. Это похоже на ваше предложение, но немного более общее (см. сообщение @Ofer Segev stackoverflow.com/questions/18737674/). - person orange; 09.04.2015

Поскольку вы не можете вмешиваться в ответ ajax 302 и перенаправлять на страницу с ошибкой, вам нужно проявить немного творчества.

Вы можете добавить заголовок или другой код ответа к соответствующим ответам и добавить перехватчик на стороне клиента.
Перехватчик — это модуль, через который проходит каждый запрос\ответ ajax.
Вы можете добавить код, который будет искать этот заголовок и просто выполнять $window.location.href на странице входа.

Прочитайте здесь о перехватчиках.
Проверьте этот пример - он обрабатывает 401 ответ.

person Amir Popovich    schedule 09.04.2015
comment
+1 это, вероятно, более чистый способ, чем проверка результата данных на предмет того, является ли это html-страницей. Могу принять только один ответ, но все равно спасибо. - person orange; 09.04.2015
comment
@orange - меня не волнуют принятые ответы, но делать это так, как Нано, на самом деле не очень хорошо (хотя это работает). Вам нужен способ идентифицировать несанкционированные запросы и обрабатывать их в общем — это означает, что вы должны использовать клиентский перехватчик. Теперь я не знаю, что вы делаете на своем сервере, но вы не хотите 302 при ошибках, как это делают некоторые фреймворки на стороне сервера (аутентификация форм .net). Вы просто хотите вернуть 401 и перенаправить на клиента. - person Amir Popovich; 09.04.2015
comment
Согласитесь, я добавил комментарий к ответу @Nano, который указывает читателям на клиентский перехватчик. - person orange; 09.04.2015