Как создать сессионный компонент?
Я хотел бы знать, как создать объект сеанса пользователя, который можно использовать для всех пользовательских запросов. Пользователь может выбирать профили после входа в систему, поэтому мне нужно обновить этот объект сеанса этими данными профиля.
Как это сделать? Как инициализировать сессионный компонент? Как я могу изменить объекты в этом компоненте SessionScoped позже (необходимо запомнить некоторые действия пользователя в его сеансе).
Я был бы очень рад, если бы вы могли помочь мне в этом вопросе:)
@SessionScoped @Named
public class UserSession implements Serializable {
private ExtendedUserPrincipal extendedUserPrincipal;
@PostConstruct
private void instantiateSession() {
extendedUserPrincipal = new ExtendedUserPrincipal();
}
public void setUserPrincipal(UserPrincipal userPrincipal) {
extendedUserPrincipal.setUserPrincipal(userPrincipal);
}
public void setUser(User user) {
extendedUserPrincipal.setUser(user);
}
public void setUserSecurityData(UserSecurityData userSecurityData) {
extendedUserPrincipal.setUserSecurityData(userSecurityData);
}
@Produces @AuthenticatedUser
private ExtendedUserPrincipal getPrincipal() {
return extendedUserPrincipal;
}
}
Я лишаю законной силы сеанс, вызывая logout() и invalidate() в сеансе, который я получаю из HttpServletRequest.
Я ввожу принципала пользователя, как это. Объект должен быть одинаковым для каждого сеанса пользователя
@Inject
@AuthenticatedUser
private ExtendedUserPrincipal extendedUserPrincipal;
1 ответ
Я не уверен, что означают все аннотации, но вы должны просто иметь возможность помещать объекты в сеанс вручную с помощью объекта HttpServletRequest.
request.getSession().setAttribute("userbean", yourBean);
Тогда, если вам нужно обновить его, просто получите и установите его как любую другую карту
request.getSession().getAttribute("userbean");
Пользователь будет оставаться в сеансе до тех пор, пока он не станет недействительным.
Существует много разных библиотек Java с разными аннотациями @, но аннотации обычно являются просто ярлыком для более простой, ручной операции.
Я не знаком с конкретной библиотекой / аннотациями, которые вы используете, но, судя по всему, @SessionScoped просто вставит компонент в атрибуты сеанса пользователя "автоматически" для вас.
Сеанс пользователя - это просто карта, которая активна в то время, когда в нее входит конкретный пользователь. Вы можете поместить любой вид java-объекта в карту атрибутов сеанса, он не должен быть объектом особого типа или чем-то еще. "Сессионный компонент" - это в основном причудливые слова для "Java-объекта, который был добавлен в пользовательскую карту атрибутов сеанса".
Когда сеанс пользователя заканчивается, объект request.getSession() уничтожается вместе с объектами в карте атрибутов (если они нигде не упоминаются), поэтому они являются "областью действия сеанса".
Кроме того, вы можете попытаться поместить @SessionScoped @Named в отдельные строки, я не уверен, что он будет анализировать их в одной строке.