2013-08-29 2 views
2

У меня есть клиент Dart и Java-сервер. Я пытаюсь добавить безопасность вокруг своего приложения, поэтому сервер Java требует, чтобы пользователь был аутентифицирован перед доступом к данным. Если приходит вызов webservice и пользователь не аутентифицирован, серверные службы отправляют перенаправление с HttpResponseCode (401) обратно на клиентский вызов. Теперь у меня есть это, когда клиент может проанализировать request.status и увидеть 401, но он не обрабатывает перенаправление.Dart Client HttpRequest ошибка/проверка подлинности

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 Server

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

Прежде всего, заголовок местоположения разрешен только с кодами состояния HTTP 201 и некоторыми кодами 3xx. Вместо этого, в действительном ответе HTTP, код состояния 401 требует отправить поле заголовка «WWW-Authenticate», что, вероятно, не является тем, что вы хотите. Вот почему ваша переадресация не выполняется автоматически.

Если ваш клиент только один для подключения к серверу и вы не заботитесь о некорректном ответе, вы можете прочитать заголовки на вашем клиенте с getResponseHeader("Location")

Или вы могли бы просто использовать статус HTTP 307 вместо ,

+0

Спасибо, я попробовал вариант 1 и прочитал repsoneHeader («Местоположение»), а затем вручную перенаправил его на эту страницу, и он работает. Я попробовал вариант 2 b/c, кажется, лучше. Поэтому на сервере я устанавливаю статус \t response.setStatus (307); response.setHeader («Местоположение», LOGIN_PAGE); но в клиентском приложении я получаю статус 200, и перенаправление не происходит автоматически. Я предполагаю, что 200 получили успешную переадресацию, но страница дротика не перешла к моему логину? – Brandon

+1

О! Нет, страница дротика не изменится. Переадресация происходит в объекте HttpRequest, а не на главной странице. Итак ... вариант 1 - это путь, я думаю. – MarioP

Смежные вопросы