2016-10-10 6 views
0

私は、JSF/Primefaceサイト用のシンプルなログインシステムを、sessionMapを使用して構築しました。私のメインビュー、私が持っているSessionScoped BeanですParliamentManagerで:JSF複数のユーザーがViewExpiredExceptionを引き起こす

RequestScoped ManagedBeanである私のログインビューで
@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(); 

私が持っている:私のログインページで

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

を私は単純にメインにリダイレクトインデックスページは:私は2人のユーザーが持っている場合

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

これは、LO OK作品(ブラウザセッションでは1つ、シークレットセッションでは別のセッション)。しかし、3番目のユーザー(別のインゴジットセッション)を追加すると、フォーム内に自分のajaxリクエストを送信するときにViewExpiredExceptionが発生します。私は多くのユーザーがいると思うので、大量のセッションができると思ったので、なぜこのような状況で例外が発生するのか分かりません。私はユーザーとセッションを間違って関連付けるのですか、または例外の原因となる他の問題がありますか?

おかげで、Chromeの場合 Zobbo

+0

は、Chromeの一つまたはFirefoxでのようなものを二つの異なる "お忍び" はありますか?または同じブラウザでシークレットブラウザを使用していますか? –

+0

こんにちはホルヘ。それらはすべて同じブラウザ(Chrome)にあります。そのため、1つの「通常の」タブ、新しいシークレットウィンドウと別のシークレットウィンドウが表示されます。ありがとう。 – zobbo

+0

Chromeは残念ながら、シークレットインスタンス間でセッションを共有しています。これを行うにはFirefoxを使用してください。 –

答えて

0

すべてのシークレットセッションが同じクッキージャーを共有しています。すべてのシークセッションが終了すると、それは破壊されます。これは、2番目のシークレットセッションが他のシークセッションとクッキーを共有することを意味します。 [1]を参照してください。

Firefoxはこのようなクッキーを共有しないため、別のブラウザでセッションを使用することも、Firefoxのような複数のプライベートセッションでブラウザを使用することもできます。

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

関連する問題