Получить предыдущий URL-адрес перехватчика запросов Angular

Я реализую угловое приложение для аутентификации.

Это машина событий, которая использует перехватчик, поэтому, если какой-либо запрос приводит к ответу 401, он выводит модальное окно входа. Когда вход в систему выполнен успешно, он снова выполняет запрос (что также может привести к ошибке 403, если у вошедшего в систему пользователя недостаточно прав для доступа к запрошенному ресурсу).

Пока все работает как положено, за исключением того, что когда пользователь отменяет процесс входа в систему, $location.path() по-прежнему указывает на запрошенный ресурс. Я хочу вернуться к предыдущему пути. Так:

Что я ожидал

Я ожидал, что смогу получить URL вызываемого абонента следующим образом:

.factory('authInterceptor', ...
  return {
    // Append the authentication headers to every request
    request: function(config) {
      previousLocation = $location.path(); // <--- HERE
      if(Session.exist) {
        config.headers.Authorization = Session.token;
      }
      return config || $q.when(config);
    },

Я ожидал, что эта строка даст мне путь к вызываемому, но на самом деле она дает мне запрошенный (angular изменил его перед выполнением запроса).

Поставщик маршрута

.config(['$routeProvider', function($routeProvider) {
  $routeProvider
  .when('/admin', {
    templateUrl: "/admin"
  })
  .otherwise({ redirectTo: '/' });
}])

Этот непослушный маленький мальчик меняет мой путь до просьбы. Я думаю, что могу что-то сделать здесь с разрешением, но я не нахожу это полезным, так как это полностью нарушит инкапсуляцию, заставляя меня разрешать каждый раз, когда я вызываю любой защищенный ресурс, поэтому я могу передать текущий путь к какой-либо службе в моем приложение авторизации

Итак, как я могу получить предыдущий путь от перехватчика или какой-либо службы в приложении аутентификации, не отправляя его явно из конфигурации провайдера маршрута?


person Luis Sieira    schedule 17.10.2015    source источник


Ответы (1)


Почему бы вам не отслеживать $on события изменения маршрута и не связывать текущий/предыдущий пути с $window или глобальной $scope переменной?

Я не читал весь ваш код выше, но вот как я обрабатываю местоположение вещи в своем приложении:

$scope.$on('$routeChangeSuccess', function(evt, current, previous){
    var routeData = {};

    //prop: uriSegment
    //desc: get all uri segments for current location
    routeData.uriSegment = [];
    routeData.uriSegment = $location.path().substr(1).split('/');

    //prop: urls
    //desc: get current & previous urls
    routeData.urls = {};
    routeData.urls.curr = $location.url().substr(1);
    //...previous url
    if(previous && previous.originalPath){
        //remove matching structure & slashes from url & add params as plain values
        var prevUrl = previous.originalPath.substr(1).replace('/:', '/').replace(':', '');
        if(previous.pathParams){
            angular.forEach(previous.pathParams, function(val, key){
                prevUrl = prevUrl.replace(key, val);
            });
        }
        routeData.urls.prev = prevUrl;
    }


    //bind routeData to scope/window...
    $scope.uriSegment = routeData.uriSegment;
    $scope.urls = routeData.urls;
});

Как это работает:

<сильный>1. Получить текущий и предыдущий URL:

$scope.urls.curr //shows current url
$scope.urls.prev //shows previous url

... если ваш маршрут определен как /admin/:userID и вы находитесь на этой странице, URL-адрес будет содержать этот конкретный идентификатор пользователя, он не вернет имя параметра. /admin/53 будет /admin/53.

<сильный>2. Получить определенный сегмент URL из текущего URL:

$scope.uriSegment[1]

... для текущего URL-адреса, такого как /admin/53, будет напечатано 53

В приведенном выше коде было еще много чего, но я думаю, что это то, что вам нужно - запомнить предыдущий URL. Вы можете играть с событиями маршрута и создавать свои собственные.
Я вижу, что вы внедряете $routeScope в свои фабрики, так что вы можете добавить мой код в свой главный контроллер и обновлять $routeScope на routeData при каждом изменении маршрута, а затем вы можете действовать следующим образом: это:

...
previousLocation = $rootScope.urls.prev;
...

Подробнее о событиях маршрута здесь.

person tbutcaru    schedule 17.10.2015
comment
Я думаю, это то, что мне нужно, я попробую и скажу вам. Всего один вопрос. Почему вы разделяете URL? - person Luis Sieira; 19.10.2015
comment
В моем приложении мне нужно было знать, что такое 1-й/2-й/и т. д. сегмент из URL-адреса, поэтому у меня есть этот массив uriSegment (пункт 2 из сообщения). У меня были случаи, когда я хотел проверить if(uriSegment[0] == 'home) { /* do something */ }. Вы можете удалить это, это не мешает URL-адресам prev/curr. - person tbutcaru; 19.10.2015
comment
Это сделало это. Теперь мне нужно выяснить, что делать, когда окно входа в систему закрывается, но оно не появляется, реагируя на изменение маршрута, а на нажатие кнопки входа; но это другая история. Спасибо! - person Luis Sieira; 19.10.2015
comment
Кстати, вместо этого я сделал это на routeChangeStart - person Luis Sieira; 19.10.2015