在Angular请求拦截器上获取以前的URL
我正在实施一个角度为全角的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应用程序中的某个服务获取上一个路径,而不从路由提供程序配置明确发送它?
为什么不看$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
,这样你就可以在你的主控制器添加我的代码和更新$routeScope
与routeData
,然后你可以去这样的:
...
previousLocation = $rootScope.urls.prev;
...
更多航线事件here。
我认为这是我需要的,我会试一试并告诉你。只是一个问题。你为什么要拆分网址? –
在我的应用程序中,我需要知道url的第一/第二/ etc段是什么,所以这就是为什么我有''uriSegment''数组(从帖子中的第2点)。我有我想检查“if(uriSegment [0] =='home){/ *做些什么* /}''的情况。你可以删除它,它不会干扰prev/curr网址。 – tbutcaru
这样做。现在我必须弄清楚当登录窗口被解散时应该怎么做,但是它不会对路由变化作出反应,而是点击登录按钮;但这是一个不同的故事。谢谢! –