JSF多个用户导致ViewExpiredException

时间:2016-10-10 19:36:34

标签: session jsf primefaces

我使用sessionMap为我的JSF / Primefaces网站构建了一个简单的登录系统。在我的主视图中,ParliamentManager是一个SessionScoped bean我有:

@PostConstruct
    public void postInit() {
      logger.log(Level.INFO,"Session started");
      ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
      Map<String, Object> sessionMap = externalContext.getSessionMap();

      user = (User) sessionMap.get("user");
      logger.log(Level.INFO, "user trader is: {0}", 
              new Object[]{user.getTrader().getTraderId().toString()});
      userId = user.getUserId();

在我的登录视图中,我有一个RequestScoped ManagedBean:

public void login(ActionEvent event) {
    RequestContext requestContext = RequestContext.getCurrentInstance();
    FacesContext context = FacesContext.getCurrentInstance();
    boolean loggedIn = false;

    User user = request.findUser(username);
    if(user.getPassword().equals(this.getPassword()))
    {
        loggedIn = true;
        context.getExternalContext().invalidateSession();
        context.getExternalContext().getSession(true);
        context.getExternalContext().getSessionMap().put("user", user);
         logger.log(Level.INFO, "put user {0}", 
              new Object[]{user.getUserId()});
         logger.log(Level.INFO, "session id {0}", 
                  new Object[]{context.getExternalContext().getSessionId(false)});
        requestContext.addCallbackParam("loggedIn", loggedIn);
    }
} 

在我的登录页面中,我只需重定向到主索引页面:

<script type="text/javascript">
function handleLoginRequest(xhr, status, args) {
    if(args.validationFailed || !args.loggedIn) {
        PF('dlg').jq.effect("shake", {times:5}, 100);
    }
    else {
        PF('dlg').hide();
        $('#loginLink').fadeOut();
        window.location = "http://localhost:8080/mysite/index.xhtml"
    }
}

如果我有两个用户登录(一个在浏览器会话中,另一个在隐身会话中),则此工作正常。但是,如果我添加第三个用户(另一个invognito会话),我在表单中提交我的ajax请求时会收到ViewExpiredException。我认为我可以有大量的会话,因为我期待很多用户,所以我不清楚为什么我在这些情况下得到例外。我是否错误地关联了用户和会话,或者是否存在导致异常的其他问题?

谢谢, Zobbo

1 个答案:

答案 0 :(得分:0)

在Chrome中,所有隐身会话共享相同的Cookie jar。只有在所有隐身会话结束后才会销毁。这意味着第二个隐身会话与其他隐身会话共享Cookie。见[1]。

您可以在其他浏览器中使用会话,也可以使用Firefox等具有多个私人会话的浏览器,因为Firefox不会像这样共享Cookie。

[1] https://bugs.chromium.org/p/chromium/issues/detail?id=24690