2015-10-17 1 views
1

Я реализую угловую страницу authentication app.Получить предыдущий URL-адрес для перехватчика углового запроса

Это машина событий, в которой используется перехватчик, поэтому, если какой-либо запрос приводит к ответу 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); 
    }, 

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

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

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

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

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

ответ

2

Почему бы вам не смотреть $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; 
... 

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

+0

Я думаю, что это то, что мне нужно, я попробую и скажу вам. Только один вопрос. Почему вы разделили URL-адреса? –

+0

В моем приложении мне нужно было знать, что является сегментом 1st/2nd/etc от URL-адреса, поэтому у меня есть этот массив '' uriSegment'' (точка 2 из сообщения). У меня были случаи, когда я хотел проверить '' if (uriSegment [0] == 'home) {/ * сделать что-то * /} ''. Вы можете удалить это, это не мешает запросам prev/curr. – tbutcaru

+0

Так оно и было. Теперь я должен выяснить, что делать, когда окно входа в систему отклонено, но оно не реагировало на изменение маршрута, но нажатие на кнопку входа в систему; но это совсем другая история. Благодаря! –

Смежные вопросы