2

我有一个 Dart 客户端和一个 Java 后端。我正在尝试在我的应用程序周围添加安全性,因此 Java 服务器要求用户在访问数据之前进行身份验证。如果 Web 服务调用进入并且用户未通过身份验证,则后端服务将带有 HttpResponseCode (401) 的重定向发送回客户端调用。我现在有了它,客户端可以解析 request.status 并看到 401 但它不处理重定向。

飞镖代码

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);

任何建议都会很棒。谢谢

4

1 回答 1

2

首先,Location 标头只允许使用 HTTP 状态代码 201 和一些 3xx 代码。相反,在有效的 HTTP 响应中,状态码 401 需要发送“WWW-Authenticate”标头字段 - 这可能不是您想要的。这就是您的重定向没有自动遵循的原因。

如果您的客户端是唯一连接到服务器的客户端,并且您不关心格式错误的响应,则可以使用以下命令读取客户端上的标头getResponseHeader("Location")

或者您可以只使用 HTTP 状态 307。

于 2013-08-30T08:23:01.973 回答