Dart 客户端 HttpRequest 错误/身份验证处理

标签 dart dart-webui

我有一个 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/

相关文章:

dart - Dart 中角组件的 Material list 的误差

dart - 如何从事件处理程序中获取对事件流的引用?

flutter - 在此主页小部件上方找不到正确的 Provider<FirebaseUser>

dart - 如何使用 dart-pub-serve 运行带模块的 gcloud 调度程序?

dart - Flutter ListView 收缩包装 - 嵌套 ListView

dart - 如何在运行时使用Dart将元素添加到聚合物自定义元素中?

dart - 在ASP.NET MVC网站上使用dart Web-ui( polymer )时,需要以javascript运行的帮助

gridview - flutter - 在 gridview 上换行时如何设置宽度?

dart - 在 Dart 中必须 element.html ("") 出现在 body 标签的上下文中吗?

dart - 是否有显示表单功能的 dart 教程?