2016-10-10 4 views
0

Ich habe ein einfaches Anmeldesystem für meine JSF/Primefaces-Site mit einer sessionMap erstellt. In meiner Hauptansicht ParliamentManager die eine SessionScoped Bohne ist habe ich:JSF Mehrere Benutzer verursachen ViewExpiredException

@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(); 

In Anmeldungs ​​Ansicht, die ein RequestScoped ManagedBean ist, ich habe:

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

In meiner Login-Seite umleiten ich einfach an die Haupt Indexseite:

<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" 
    } 
} 

Dies funktioniert ok, wenn ich zwei Benutzer lo (eine in einer Browser-Sitzung, eine andere in einer Inkognito-Sitzung). Wenn ich jedoch einen dritten Benutzer (eine andere Invognito-Sitzung) hinzufüge, erhalte ich eine ViewExpiredException, wenn ich meine Ajax-Anfrage in einem Formular absende. Ich dachte, dass ich eine große Anzahl von Sitzungen haben könnte, da ich viele Benutzer erwarten würde, deshalb bin ich nicht klar, warum ich unter diesen Umständen die Ausnahme bekomme. Ordne ich den Benutzer und die Sitzung falsch zu oder könnte ein anderes Problem die Ausnahme verursachen?

Danke, Zobbo

+0

Sind diese zwei verschiedenen "inkognito" wie man in Chrom oder ein in Firefox? Oder beides im selben Browser inkognito Browser? –

+0

Hallo Jorge. Sie befinden sich alle im selben Browser (Chrome). Also eine "normale" Registerkarte, ein neues Inkognito-Fenster und ein weiteres Inkognito-Fenster. Vielen Dank. – zobbo

+0

Chrome teilt Sitzungen in allen Inkognito-Instanzen leider. Verwenden Sie dazu Firefox. –

Antwort

0

In Chrome alle Inkognito-Sessions teilen sich die gleiche Keksdose. Es wird nur zerstört, wenn alle Inkognito-Sitzungen geschlossen sind. Dies bedeutet, dass eine zweite Inkognito-Sitzung die Cookies mit den anderen Inkognito-Sitzungen teilt. Siehe [1].

Sie können entweder eine Sitzung in einem anderen Browser verwenden oder einen Browser wie Firefox mit mehreren privaten Sitzungen verwenden, da Firefox solche Cookies nicht teilt.

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

Verwandte Themen