我有一个 Dart 客户端和一个 Java 后端。我正在尝试增加应用程序的安全性,因此 Java 服务器要求用户在访问数据之前进行身份验证。如果传入 Web 服务调用并且用户未经过身份验证,则后端服务会将带有 HttpResponseCode (401) 的重定向发送回客户端调用。我现在知道客户端可以解析 request.status 并看到 401,但它不处理重定向。
Dart 代码
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);
任何建议都会很棒。 谢谢
最佳答案
首先,Location header 仅允许使用 HTTP 状态代码 201 和某些 3xx 代码。相反,在有效的 HTTP 响应中,状态代码 401 需要发送“WWW-Authenticate” header 字段 - 这可能不是您想要的。这就是您的重定向不会自动遵循的原因。
如果您的客户端是唯一连接到服务器的客户端,并且您不关心格式错误的响应,则可以使用 getResponseHeader("Location")
读取客户端上的 header
或者您可以只使用 HTTP 状态 307。
关于Dart 客户端 HttpRequest 错误/身份验证处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18519413/