-1

我想知道如何创建一个可以在所有用户请求中使用的用户会话对象。用户可以在登录后选择配置文件,因此我需要使用此配置文件数据更新该会话对象。

它是如何完成的?如何初始化会话范围的 bean?以后如何更改该 SessionScoped bean 中的对象(有必要记住他的会话中的一些用户操作)。

如果你能在这件事上帮助我,我会很高兴:)

@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;
    }

}

我通过在从 HttpServletRequest 获得的会话上调用 logout() 和 invalidate() 来使会话无效。

我正在像这样注入用户主体。每个用户会话的对象应该是相同的

@Inject
@AuthenticatedUser
private ExtendedUserPrincipal extendedUserPrincipal;
4

1 回答 1

-1

我不确定所有注释的含义,但您应该能够使用 HttpServletRequest 对象手动将对象放入会话中。

request.getSession().setAttribute("userbean", yourBean);

然后,如果您需要更新它,只需像任何其他地图一样获取并设置它

request.getSession().getAttribute("userbean");

userbean 将保留在会话中,直到它失效。


有许多不同的 java 库具有不同的 @ 注解,但注解通常只是更基本的手动操作的快捷方式。

我不熟悉您正在使用的特定库/注释,但从它的外观来看,@SessionScoped 只会为您“自动”将 bean 注入用户的会话属性中。

用户的会话只是一个在特定用户登录时处于活动状态的映射。您可以将任何类型的 java 对象放入会话属性映射中,它不需要是特殊类型的对象或任何东西。“会话范围 bean”基本上是“已添加到用户会话属性映射中的 java 对象”的花哨词。

当用户的会话结束时, request.getSession() 对象和属性映射中的对象一起被销毁(只要它们没有在其他任何地方引用),这就是它们是“会话范围”的原因。

此外,您可能想尝试将 @SessionScoped @Named 放在单独的行上,我不确定它是否会像这样在一行上解析它们。

于 2018-01-16T21:47:21.250 回答