Управление сеансом в gwt
Я использую GWT для своего клиентского приложения. Однако я не уверен, как я могу справиться с управлением сеансами. Приложение GWT находится на одной странице, все вызовы сервера выполняются через AJAX. Если сеанс истекает на сервере. предположим, что пользователь не закрыл браузер и отправил некоторый запрос на сервер с помощью RPC, как мой сервер мог уведомить приложение о том, что срок действия сеанса и что часть клиентской стороны должна снова отобразить экран входа? Мой пример кода:
ContactDataServiceAsync contactDataService = GWT
.create(ContactDataService.class);
((ServiceDefTarget) contactDataService).setServiceEntryPoint(GWT
.getModuleBaseURL()
+ "contactDatas");
contactDataService.getContact(2,
new AsyncCallback<ContactData>() {
public void onFailure(Throwable caught) {
//code to show error if problem in connection or redirect to login page
}
public void onSuccess(ContactData result) {
displayContact(result);
}
});
Если сеанс истекает, он должен показывать экран входа в систему, иначе он хочет показать некоторую ошибку, используя Window.alert().
Как это сделать и какие коды необходимы на стороне сервера и на стороне клиента?
Ответы
Ответ 1
Вы могли бы заставить сервер выдать AuthenticationException клиенту в случае, если пользователь был выведен из системы.
Это будет уловлено в методе обратных вызовов onFailure, который затем может перенаправить пользователя на страницу входа.
Edit:
AuthenticationException не является стандартным исключением, я просто делал пример. Лучше всего придерживаться стандартных исключений.
Чтобы попробовать, если вы поймали конкретное исключение, вы можете использовать оператор instanceof
public void onFailure(Throwable e) {
if(e instanceof AuthenticationException) {
redirecttoLogin();
}
else {
showError(),
}
}
Ответ 2
Это не относится непосредственно к тем, кто использует RPC, но для тех из вас, кто не использует RPC, вы должны отправить HTTP 401 с сервера. Затем вы можете проверить этот код состояния в обратном вызове RequestBuilder.
Ответ 3
Клиент:. Все обратные вызовы расширяют абстрактный обратный вызов, когда вы реализуете onFailur()
public abstract class AbstrCallback<T> implements AsyncCallback<T> {
@Override
public void onFailure(Throwable caught) {
//SessionData Expired Redirect
if (caught.getMessage().equals("500 " + YourConfig.ERROR_MESSAGE_NOT_LOGGED_IN)) {
Window.Location.assign(ConfigStatic.LOGIN_PAGE);
}
// else{}: Other Error, if you want you could log it on the client
}
}
Сервер:. Все ваши ServiceImplementations расширяют AbstractServicesImpl, где у вас есть доступ к вашим SessionData. Переопределите onBeforeRequestDeserialized (String serializedRequest) и проверьте там SessionData. Если срок действия SessionData истекает, то пишите сообщение с пространственной ошибкой клиенту. Это сообщение об ошибке получает checkt в вашем AbstrCallback и перенаправляется на страницу входа.
public abstract class AbstractServicesImpl extends RemoteServiceServlet {
protected ServerSessionData sessionData;
@Override
protected void onBeforeRequestDeserialized(String serializedRequest) {
sessionData = getYourSessionDataHere()
if (this.sessionData == null){
// Write error to the client, just copy paste
this.getThreadLocalResponse().reset();
ServletContext servletContext = this.getServletContext();
HttpServletResponse response = this.getThreadLocalResponse();
try {
response.setContentType("text/plain");
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
try {
response.getOutputStream().write(
ConfigStatic.ERROR_MESSAGE_NOT_LOGGED_IN.getBytes("UTF-8"));
response.flushBuffer();
} catch (IllegalStateException e) {
// Handle the (unexpected) case where getWriter() was previously used
response.getWriter().write(YourConfig.ERROR_MESSAGE_NOT_LOGGED_IN);
response.flushBuffer();
}
} catch (IOException ex) {
servletContext.log(
"respondWithUnexpectedFailure failed while sending the previous failure to the client",
ex);
}
//Throw Exception to stop the execution of the Servlet
throw new NullPointerException();
}
}
}
В дополнение вы также можете переопределить doUnexpectedFailure (Throwable t), чтобы избежать регистрации сброшенного исключения NullPointerException.
@Override
protected void doUnexpectedFailure(Throwable t) {
if (this.sessionData != null) {
super.doUnexpectedFailure(t);
}
}