Доступ к пользовательской сессии из бэкэнда
Я занимаюсь разработкой веб-приложения с двумя основными подразделениями, одно из которых - сторона приложения Wicket и сторона приложения Restlet, которые достаточно разделены. Хотя код находится в том же проекте, я хочу отделить его, поэтому часть Wicket вызывает службы REST, предоставляемые бэкендом Restlet.
Теперь проблема связана с Session, в части Restlet есть компонент Shiro, который выполняет аутентификацию et. и др. когда /login
доступ и правильная пара имя пользователя и пароль предоставляется.
Вопрос в том, что такое подход, при котором часть приложения Wicket будет знать о пользователе сеанса, который в данный момент вошел в систему Restlet с помощью Shiro?
2 ответа
Если ваша серверная часть Restlet использует тот же веб-сеанс, который предоставляется контейнером с вашим приложением Wicket, вы можете получить к нему доступ в Wicket с помощью:
((HttpServletRequest) RequestCycle.get().getRequest().getContainerRequest()).getSession()
Что дает вам javax.servlet.http.HttpSession, предоставляемый Servlet API. Сеанс вашей Wicket, который расширяет org.apache.wicket.protocol.http.WebSession, хранится в этом сеансе в wicket: wicket.yourapp: ключ сеанса вместе с другими данными, установленными вами, или библиотеками, которые вы используете за пределами Wicket.
Я не знаю Restlet и как вы там распространяете сессию, но я предполагаю, что вам понадобится зависимость от сервлетов в вашей части Restlet / Shiro, которая хранит данные в сессии.
Редактировать: Проверка интерфейса сеанса Shiros//A Session is intended to be managed by the business tier and accessible via other tiers without being tied to any given client technology. This is a great benefit to Java systems, since until now, the only viable session mechanisms were the javax.servlet.http.HttpSession or Stateful Session EJB's, which many times unnecessarily coupled applications to web or ejb technologies
Учитывая это, предложенное выше предложение не будет работать, но, похоже, вы сможете легко получить доступ к объекту Shiros Session, если добавите зависимость Shiro в свою часть Wicket.
Вы создаете новый запрос HttpServletRequest для своей серверной части Restlet, поэтому он создает сеанс между вашим интерфейсом и внутренним сервером и не использует текущий сеанс между браузером пользователей и внешним интерфейсом.
Только так это будет работать, если вы попытаетесь перехватить сеанс в вашем приложении, чтобы иметь возможность получить сеанс пользователя в обоих компонентах.