2013-08-29 41 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