2015-10-17 71 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

这样做。现在我必须弄清楚当登录窗口被解散时应该怎么做,但是它不会对路由变化作出反应,而是点击登录按钮;但这是一个不同的故事。谢谢! –