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