Как обновить мой браузер, когда мой контроллер angularjs получает HTTP 303

Мой код RestEasy отправляет ответ 303 на контроллер angularjs. Кроме того, сетевая отладка Chrome показывает, что и HTTP 303 получен, и новый URL-адрес загружен (отображается как HTTP 200), но никогда не отображается!

Если я попытаюсь вызвать конечную точку RestEasy напрямую из моего браузера, она будет хорошо перенаправлена!

Но, увы, мой контроллер angularjs, похоже, не может обновить браузер - он остается на той же странице!

Вот мой контроллер angularjs:

var mod = angular.module('login', []);
mod.controller('RestController', [
        '$http',
        '$scope',
        function($http, $scope) {

            $scope.submit = function(v1, v2) {
              $http.post("rest/login/submit", {
                  param1 : v1,
                  param2    : v2
                }).success(function(data, status, headers, config) {
                    $scope.submitmsg = "";

            }).error(function(data, status, headers, config) {
                $scope.submitmsg = "Error...";
            });
        }
    } ]);

Мой вопрос прост: должен ли я сделать что-то особенное для обновления страницы браузера. Возможно, установить какую-то переменную $scope или $doc или что-то в этом роде?? Или, может быть, мне следует выполнить некоторую обработку в error()-части функции, чтобы адресовать код 303?

Любая помощь приветствуется. Все тесты проводились в Chrome.


person mortensi    schedule 11.12.2014    source источник
comment
Почему вы хотите возвращать код 303 в запросах ajax - возвращайте данные, такие как {itemCreatedId: '3837373'}, и в случае успеха перейдите к #viewItem/3837373.   -  person Petr Averyanov    schedule 11.12.2014
comment
Дело не в том, что я абсолютно хочу выполнить перенаправление именно таким образом — это просто то, что пришло мне в голову, поскольку у меня была конечная точка RestEasy и контроллер angularjs. Если вы знаете более простой способ сделать редирект, буду рад получить ваш совет.   -  person mortensi    schedule 12.12.2014


Ответы (2)


Код ответа 303 не следует использовать в одностраничных приложениях. Он обрабатывается браузером перед фреймворком angular.

Вы должны вернуть соответствующий код ошибки вместо перенаправленной команды 3xx; 5xx в случае ошибки сервера, 401 при несанкционированном доступе и так далее.

Если это должен быть глобальный обработчик исключений или только специфичный для контроллера, действительно зависит от действия, которое должно быть предпринято из-за этого. В свете имеющейся информации я бы порекомендовал приложению глобальный обработчик, который перенаправлял бы пользователя с помощью $location.path("...");

person Heikki    schedule 12.12.2014
comment
Спасибо за ваш комментарий, он помог мне понять, что я искал решение не в том месте. Кажется плохой идеей отправлять 303 из конечной точки Rest. Вместо этого я решил отправить HTTP 200 (вместе с некоторой информацией об URL-адресе). Однако использование $loaction.path() кажется неправильным выбором для фактического выполнения перенаправления. В конце концов, $window.location.href помог мне. Я опубликую ответ на это, и комментарии, конечно, приветствуются. - person mortensi; 13.12.2014
comment
Служба @mortensi $location не является неправильным выбором для перенаправления браузера. Если вы используете API более низкого уровня (window.location), остерегайтесь вещей, от которых вы отказываетесь. Взгляните на раздел Сравнение $location с window.location из docs.angularjs.org/guide/$ расположение для ясности. - person Heikki; 17.12.2014
comment
Согласно одобренному ответу на stackoverflow.com/questions/18875467/, $location не подходит. Я могу чего-то не понять, поэтому, если возможно, поясните. - person mortensi; 18.12.2014
comment
@mortensi Прошу прощения, я не понял, что вы хотите выйти за пределы своего приложения. В этом случае вы правы, использование API более низкого уровня - ваш единственный вариант. - person Heikki; 18.12.2014

Не рекомендуется отправлять HTTP 303 с вашей конечной точки. Я думаю, что это может быть перехвачено браузером. Лучшей альтернативой является возврат информации об URL-адресе, на который вы хотите перенаправить (вместе с соответствующим HTTP-ответом — может быть 200, 400 или что-то еще) и использование $window.location.href для выполнения перенаправления:

var mod = angular.module('login', []);
mod.controller('RestController', [
        '$http',
        '$scope',
        '$window',
        function($http, $scope,$window) {

            $scope.submit = function(v1, v2) {
              $http.post("rest/login/submit", {
                  param1      : v1,
                  param2    : v2
                }).success(function(data, status, headers, config) {
                    $window.location.href = "http://host:port/path"
                }).error(function(data, status, headers, config) {
                    $scope.submitmsg = "error";
                });
            }
        } ]);
person mortensi    schedule 13.12.2014