Как создать сессионный компонент?

Я хотел бы знать, как создать объект сеанса пользователя, который можно использовать для всех пользовательских запросов. Пользователь может выбирать профили после входа в систему, поэтому мне нужно обновить этот объект сеанса этими данными профиля.

Как это сделать? Как инициализировать сессионный компонент? Как я могу изменить объекты в этом компоненте 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 в отдельные строки, я не уверен, что он будет анализировать их в одной строке.

Другие вопросы по тегам