获取Angular请求拦截器

时间:2015-10-17 10:13:37

标签: angularjs interceptor ngroute

我实现了一个有角度的页面范围authentication app

它是一个使用拦截器的事件机器,因此如果任何请求导致401响应,它会弹出一个登录模式。当登录成功时,它会再次执行请求(如果记录的用户没有足够的权限访问请求的资源,也可能导致403)。

很长时间,事情正在按预期工作,除了当用户取消登录过程时,$location.path()仍然指向所请求的资源。我想将其恢复到上一个​​路径。所以:

我的期望

我希望能够得到#34; callee"像这样的网址:

.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);
    },

我希望这条线给我&#34; callee&#34;路径,但它实际上给了我一个请求的(角度在执行请求之前已经改变了它)。

路线提供者

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

这个顽皮的小男孩正在改变我的路径。我想我可以在这里解决一些问题,但我发现这没有用,因为它会彻底破坏封装,迫使我每次调用任何受保护资源时都要解决,所以我可以将当​​前路径传递给某些服务在我的身份验证应用程序中。

那么,如何从拦截器或auth应用程序中的某些服务获取以前的路径,而无需从路由提供程序配置中明确发送它?

1 个答案:

答案 0 :(得分: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。得到最新的&amp;上一个网址:

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

...如果您的路由定义为/admin/:userID并且您在该页面上,则该网址将包含该特定用户ID,它将不会返回该参数名称。 /admin/53将为/admin/53

<强> 2。从当前网址获取特定网址:

$scope.uriSegment[1]

...对于/admin/53这样的当前网址,将打印53

上面的代码中有很多东西,但我认为这就是你需要的东西 - 记住以前的代码。您可以玩路线活动并建立自己的活动 我看到您在工厂中注入$routeScope,因此您可以在主控制器中添加我的代码,并在每次路由更改时使用$routeScope更新routeData,然后您可以这样:

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

有关路线事件的更多信息here