2013-08-29 2 views
2

다트 클라이언트와 자바 백엔드가 있습니다. 내 응용 프로그램 주위에 보안을 추가하려고하므로 Java 서버는 사용자가 데이터에 액세스하기 전에 인증을 받아야합니다. 웹 서비스 호출이 들어오고 사용자가 인증되지 않은 경우 백엔드 서비스는 HttpResponseCode (401)를 사용하여 클라이언트 호출로 리디렉션을 보냅니다. 이제 클라이언트가 request.status를 구문 분석하고 401을 볼 수 있지만 리디렉션을 처리하지 못합니다.다트 클라이언트 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"); 
} 

자바 서버

//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

먼저 Location 헤더는 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