GWT: способ отменить PlaceChangeEvent?
Я использую Activity/Place
в моем проекте GWT, если текущий пользователь не вошел в систему, когда он переходит к некоторым Place
, пользователь будет перенаправлен на страницу входа, если пользователь вошел в систему, то он будет перенаправлен на Place
, Как эффективно реализовать эту логику?
Я пытался подключить PlaceChangeRequestEvent:
eventBus.addHandler(PlaceChangeRequestEvent.TYPE,new PlaceChangeRequestEvent.Handler() {
@Override
public void onPlaceChangeRequest(PlaceChangeRequestEvent event) {
Place newPlace = event.getNewPlace();
if (newPlace instanceof MyProtectedPlace && userNotLoggedIn()) {
event.goTo(new LoginPlace());
}
}
});
К сожалению, это не работает, так как текущий запрос на MyProtectedPlace
не отменяется Да, я мог бы проверить это, когда пользователь собирается перейти от текущего места, но это не будет эффективно, поскольку логика проверки будет разбросана по всей программе.
Благодарю.
1 ответ
Вы можете сделать это немного по-другому, я думаю. Допустим, вы хотите, чтобы место с именем SecuredPlace было доступно только после входа в систему. У вас есть соответствующий SecuredActivity.
Что вы можете сделать, так это то, что когда вы запускаете SecuredActivity, вы проверяете, вошел ли ваш пользователь в систему. Если нет, вы делаете placeController.goTo(новый LoginPlace ()).
Если пользователь вошел в систему, то вы продолжите. Поскольку начало вызывается фреймворком, нет способа пропустить этот шаг, что, на мой взгляд, делает его достаточно безопасным.
Но вы должны реализовать свою безопасность при сетевых вызовах на сервер, а не на местах. Каждый раз, когда вы вызываете бэкэнд, вы проверяете, что пользователь аутентифицирован и имеет правильные учетные данные. Если нет, вы можете перехватить обратный вызов, убедитесь, что это ошибка 403, а затем автоматически перенаправить на свою страницу входа. Потому что, если ваши внутренние вызовы не защищены, защита ваших мест бесполезна.