2013-08-29 42 views
2

我有一個Dart客戶端和一個Java後端。我試圖圍繞我的應用程序添加安全性,因此Java服務器需要用戶在訪問數據之前進行身份驗證。如果web服務調用進入並且用戶未被認證,則後端服務發送具有HttpResponseCode(401)的重定向回到客戶端調用。我現在知道客戶端可以解析request.status並查看401,但它不處理重定向。Dart客戶端HttpRequest錯誤/身份驗證處理

飛鏢代碼

HttpRequest request=new HttpRequest(); 
    request.onReadyStateChange.listen((_) { 
    if (request.readyState == HttpRequest.DONE && 
     (request.status == 200 || request.status == 0)) { 
     onHistoryLoaded(request.responseText); 
    } 
    }); 

    request.open("GET", url); 
    request.send(); 
    request.onLoadEnd.listen((e) => processRequest(request)); 
    request.onError.listen((Object error)=>handleError(error)); 

void processRequest(HttpRequest request) { 
    var status = request.status; 
    print("status $status"); //401 
} 

void handleTheError(Error e){ 
    print("handleTheError Request error: $e"); 
} 

Java服務器

//Tried both of these 
// response.setStatus(HttpStatusCodes.STATUS_CODE_UNAUTHORIZED); 
// response.sendRedirect(LOGIN_PAGE); 

     response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
     response.setHeader("Location", LOGIN_PAGE); 

任何建議將是巨大的。 謝謝

回答

2

首先,位置標頭只允許HTTP狀態碼201和一些3xx代碼。相反,在有效的HTTP響應中,狀態碼401需要發送「WWW-Authenticate」標題字段 - 這可能不是您想要的。這就是您的重定向不會自動執行的原因。

如果您的客戶端連接到服務器的唯一的一個,你不關心格式錯誤的響應,你可以用getResponseHeader("Location")

閱讀您的客戶端上的頭或者你可以只使用HTTP狀態307代替。

+0

謝謝,我試過選項1並閱讀repsoneHeader(「位置」),然後手動重定向到該頁面,它的工作。我確實嘗試了選項2 b/c,似乎更好。所以在服務器上,我設置了狀態\t response.setStatus(307); response.setHeader(「Location」,LOGIN_PAGE);但在客戶端應用程序中,我得到的狀態爲200,重定向不會自動發生。我假設200來自成功的重定向,但飛鏢頁面沒有導航到我的登錄? – Brandon

+1

哦!不,飛鏢頁面不會改變。重定向發生在HttpRequest對象中,而不是主機頁面。所以...我猜,選項1是最好的選擇。 – MarioP