#java #jsp #wicket
#java #jsp #wicket
Вопрос:
Я выполняю инкрементную миграцию JSP -> Wicket. Я сохранил приложение JSP и выполнял постраничную миграцию. Я могу перейти и вернуться со страниц JSP <—> wicket.Но моя проблема в том, что в JSP мои учетные данные пользователя, вошедшего в систему, хранятся в компоненте (UserBean, scope: session), и в JSP на каждой странице я проверяю пользователя, вошедшего в систему из этого компонента.
Но как я могу получить эти сведения в wicket? чтобы с моей страницы JSP, если пользователь вошел в систему, при загрузке страницы wicket он мог прочитать это и установить дополнительную информацию, чтобы моя страница входа в систему wicket не отображалась.
моя страница wicket использует wicket-auth-role и проверяет с помощью:
@AuthorizeInstantiation("ADMIN") public class HomePage extends BasePage {.....}
У меня есть мой собственный UserDetailsServcice и MyAuthenticationWebSession в wicket.
После нескольких попыток и помощи от Дона Роби, здесь я получил идентификатор пользователя из сеанса в wicket:
final RequestCycle requestCycle = RequestCycle.get();
WebRequest wr=(WebRequest)requestCycle.getRequest();
HttpServletRequest hsr= wr.getHttpServletRequest();
AuthenticatedWebSession session = OrbitWebSession.get();
String username = (String)hsr.getSession().getAttribute("SessionUser");
Теперь, где именно я могу установить имя пользователя, пароль и вызвать authenticate, чтобы моя страница не перенаправлялась на страницу входа? Кто вызывает методы authenticate() и как? Я пробовал метод onBeforeRender () на своей защищенной странице, но он не работает. 🙁
Ответ №1:
Более подробный код, касающийся процесса входа в систему, может помочь нам получить более полный ответ, но в основном вам нужно получить доступ к обычному сеансу контейнера сервлета и, следовательно, к этому компоненту откуда-то из wicket. Вероятно, лучшее место для размещения этой логики находится где-нибудь в вашем MyAuthenticationWebSession
, чтобы оно знало, что пользователь вошел в систему.
Чтобы получить доступ к сеансу контейнера сервлета из кода wicket, вы можете использовать
httpSession =
((WebRequest)request).getHttpServletRequest().getSession();
Если на момент, когда вы вводите это в свой код wicket, у вас еще нет этого WebRequest
объекта (который, скорее всего, является ServletWebRequest
объектом), вы можете получить его из RequestCycle
:
RequestCycle requestCycle = RequestCycle.get();
Request request = requestCycle.getRequest();
Ответ №2:
аутентификация вызывается AuthenticatedWebSession во время процесса входа в систему. К сожалению для вас, большинство методов в вышеупомянутом классе помечены как final, поэтому их немного сложно настроить.
Что, я думаю, вы должны быть в состоянии сделать, так это использовать защищенный метод signIn (логическое значение) в конструкторе вашего собственного сеанса. Вы получаете там запрос, из которого, мы надеемся, вы сможете получить своего «SessionUser», затем извлечь своего пользователя через свой UserDetailsService, вызвать signIn (true) и инициализировать правильные роли для этого пользователя. Если вызывается signIn (true), вы не должны получать перенаправление для входа в систему.