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

First of all, the Location header is only allowed with HTTP status codes 201 and some 3xx codes. Instead, in a valid HTTP response, status code 401 requires to send the "WWW-Authenticate" header field - which is probably not what you want. That's the reason your redirect isn't followed automatically.

If your client is the only one to connect to the server and you don't care about the malformed response, you can read the headers on your client with getResponseHeader("Location")

Or you could just use HTTP status 307 instead.

于 2013-08-30T08:23:01.973 に答える