2015-10-17 59 views
1

我正在實施一個角度爲全角的authentication app在Angular請求攔截器上獲取以前的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應用程序。

那麼,如何從攔截器或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.獲取當前&前面的網址:

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

......如果你的路由被定義爲/admin/:userID並且你在那個頁面上,url將包含那個特定的userID,它不會返回參數名。 /admin/53將是/admin/53

2.從目前的網址,以獲取特定的URL段:

$scope.uriSegment[1] 

...當前URL像/admin/53將打印53

有在上面的代碼有很多更多的東西,但我認爲這就是你需要的 - 記住以前的網址。你可以玩路線事件並建立你自己的。
我看到你在每一個路徑改變注入你們工廠$routeScope,這樣你就可以在你的主控制器添加我的代碼和更新$routeScoperouteData,然後你可以去這樣的:

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

更多航線事件here

+0

我認爲這是我需要的,我會試一試並告訴你。只是一個問題。你爲什麼要拆分網址? –

+0

在我的應用程序中,我需要知道url的第一/第二/ etc段是什麼,所以這就是爲什麼我有''uriSegment''數組(從帖子中的第2點)。我有我想檢查「if(uriSegment [0] =='home){/ *做些什麼* /}''的情況。你可以刪除它,它不會干擾prev/curr網址。 – tbutcaru

+0

這樣做。現在我必須弄清楚當登錄窗口被解散時應該怎麼做,但是它不會對路由變化作出反應,而是點擊登錄按鈕;但這是一個不同的故事。謝謝! –