Jsf 来自同一浏览器的多个会话

Jsf 来自同一浏览器的多个会话,jsf,session,Jsf,Session,我需要一点JSF(2.2.6)中的方向理解课程。我试图找到一些文档,但仍然缺少一些内容 我有一个@RequestScope登录bean,它将参数保存在会话映射中,以供其他会话范围的备份bean参考。他们通过PostConstruct方法获得用户信息,一切都很好 但是,当使用了多个窗口或用户没有注销并直接返回登录页面时,逻辑会失败。JSF将其视为同一个会话,并且不调用@PostConstructs 我很确定我可以使会话无效,但这并不能解决来自不同浏览器窗口的多个用户的问题 任何指导或参考网站将不胜

我需要一点JSF(2.2.6)中的方向理解课程。我试图找到一些文档,但仍然缺少一些内容

我有一个@RequestScope登录bean,它将参数保存在会话映射中,以供其他会话范围的备份bean参考。他们通过PostConstruct方法获得用户信息,一切都很好

但是,当使用了多个窗口或用户没有注销并直接返回登录页面时,逻辑会失败。JSF将其视为同一个会话,并且不调用@PostConstructs

我很确定我可以使会话无效,但这并不能解决来自不同浏览器窗口的多个用户的问题

任何指导或参考网站将不胜感激

提前谢谢!
John

每个浏览器窗口的会话必须相同,唯一的例外是使用匿名模式时:即chrome的行为类似于同时打开两个浏览器

拥有多个会话的另一种方法是使用不同的服务器名称:
http://localhost:8080/app
http://127.0.0.1:8080/app
不能共享单个会话

但是,会话从不重叠

如果我理解正确的话,您的问题是当登录的用户访问登录页面并重新登录时,保留了他的旧会话,这就是为什么会话bean不会再次后构造(独立于使用的窗口)

一般的解决方案是禁止登录用户访问登录页面。 一般来说,当用户在未事先注销的情况下重新登录时,容器将抛出AlreadyAuthenticatedException或类似内容

长话短说,只是一个初步示例,等待您的代码:

@ManagedBean
@SessionScoped
public class UserBean implements Serializable
{
    private static final long serialVersionUID = 1L;

    private User user;

    public boolean isLoggedIn()
    {
        return user != null;
    }

    public void login(String username, String password)
    {
        // maybe you want to check isLoggedIn() and either call logout() or throw an exception

        HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        request.login(username, password);

        user = someDAO.loadFromDatabase(username); 
    }

    public void logout()
    {
        // maybe you want to check isLoggedIn() and either throw an exception or do nothing

        HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        request.logout();

        user = null;

        // suggested for another scenario
        // request.getSession().invalidate();
    }

    // getters and setters
}


通过这种组合,我没有使用OperationBean的@PostContract,而是使用了@ManagedProperty,这样OperationBean就包含了一个对用户的始终最新的引用,而不必考虑多次重新登录。

我只是不明白您在这里是如何使用post构造的。在处理用户输入之前不应该调用它吗?一个浏览器==一个会话!根据定义。JBoss Seam“conversations”是解决此问题的一个解决方案,但这是一个笨拙的解决方案。@登录身份验证由我的登录bean处理,然后使用返回字符串导航到另一个页面。该页面的呈现在SessionScoped bean中。@EJP您可能是对的,但我用其他应用程序进行了测试,它们处理得很好。至于用户只是热链接回登录。我应该使用session.invalidate()还是最好的处理方法。为什么不直接登录sessionbean呢?但是,即使用户未登录,也会存在会话。
@ManagedBean
@SessionScoped
public class OperationBean implements Serializable
{
    private static final long serialVersionUID = 1L;

    @ManagedProperty("#{userBean}")
    private UserBean userBean;

    public void execute()
    {
        if(!userBean.isLoggedIn())
        {
            FacesContext.getCurrentInstance().getExternalContext().redirect("login.jsf");
            return;
        }

        User user = userBean.getUser();

        // do something 
    }

    // getters and setters
}