2015-09-17 62 views
0

我正在用Angular構建一個認證解決方案。我正在使用攔截器來驗證請求,並且如果沒有有效的令牌阻止進一步處理和重定向。這裏是我的簡化攔截:

prism.service('APIInterceptor', function($rootScope) { 
var service = this; 

service.request = function(config) { 
    ..... 
    return config; 
    }; 
}) 

只是爲了POC的緣故,我對你會從任何進一步的處理停止該請求的正確方法是工作?

由於

+0

'return null;'可能會這樣做。 – CollinD

+0

是的,它不會去數據,但在控制檯它說:TypeError:無法讀取屬性'標題'null – Mark

+0

嘗試打印出配置對象,看看裏面有什麼方法和領域。如果您不能徹底取消XHR請求的啓動,也許您可​​以將其指向無效的URL。這仍然會拋出404,但它不應該破壞任何東西。 – CollinD

回答

1

從角文檔上攔截器爲request方法:

request: interceptors get called with a http config object. The function is free to modify the config object or create a new one. The function needs to return the config object directly, or a promise containing the config or a new config object.

文檔的其餘部分,可以發現here。從這裏你可以看到這個方法也可以返回一個promise(這實際上非常棒),所以你總是可以拒絕它。

嘗試這樣:

prism.service('APIInterceptor', function($q, $rootScope) { 
    this.request = function(config) { 
    if(/*config is not valid*/) { 
     return $q.reject({message: 'ERROR, ERROR... INTRUDER ALERT!', status: 401, config: config}); 
    } else { 
     return config; 
    } 
    }; 
}); 

,看看它是如何被處理的(我不知道你的應用程序會做什麼)。讓我知道它是否適合你!

編輯:我的答案已被接受,但不完整,如果我沒有完成,它會永遠困擾我。所以,在編寫我自己的一些測試代碼之後,我意識到在這種情況下你可以做1件事。首先是處理在攔截未授權請求:

... 
this.request = function(config) { 
    if(/* config is not authorized */) { 
    // Do something here like redirect/issue another request... whatever 
    return $q.reject({/*whatever the hell you want*/}); 
    } else ... 
}; 
... 

如果要處理所有未授權的請求相同的,這顯然效果最好。但是,如果您不這樣做,第二種選擇是推遲發出請求的服務。例如,如果你使用$http你可以這樣做:

$http.get('/words/words/words/').then(function(){ 
    // This is where you handle a successful request. 
}, function(error) { 
    // Handle your error here. Please take note that this error message is 
    // whatever you sent back in the `reject` previously 
}); 

希望這清除了一些東西了。

+0

我試圖返回你的代碼。處理已停止,但如果這是您所期望的,我沒有看到任何警報消息。 – Mark

+0

該消息可能返回給'$ http.get('.../someroute /')。error(function(error){});'callback。但是,如果授權失敗時的行動計劃是應用程序範圍內的,則可以在該條件下編寫任何您想要的邏輯,以重定向/通知其他服務,而無需處理您收到的錯誤。如果你的行動計劃在每個請求的基礎上有所不同,你應該嘗試'error'回調 – Mike

+0

那麼,它返回到response = response.then(function(data){return data.data; });這將是很好的返回到response.catch(函數(數據){q.reject(data); }); – Mark