2011-02-03 73 views
2

我看到與此問題中提到的類似問題 - https://stackoverflow.com/questions/1495390/how-do-i-invalidate-a-session-in-jsfsession.invalidate()實際上並未清除JSF會話作用域值

我有一個會話範圍LoginBean,其中有一個動作註銷爲#

ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); 
    HttpSession session = (HttpSession) ec.getSession(false); 
    HttpServletResponse response = (HttpServletResponse) ec.getResponse(); 

    // remove cookies 
    response.addCookie(facade.removeCookie(((HttpServletRequest)ec.getRequest()).getCookies())); 
    // check what we have in sessionMap 
    System.out.println(ec.getSessionMap()); 
    // remove attribute 
    session.removeAttribute("XYZ"); 

    // invalidate session 
    if (session != null) { 
     System.out.println("invalidating session"); 
     session.invalidate(); 
    } 
    // see what is there in session map 
    System.out.println(ec.getSessionMap()); 

它幾乎正常工作。

輸出#

{[email protected],... }
invalidating session
{}

的sessionMap是空的,意味着沒有會話範圍豆。但是,註銷操作後,它會重定向到另一個相同的頁面。登錄是同一頁面上的一個圖層。我看到片段jsps仍然顯示舊數據。

我沒有刪除facade.removeCookie中的JSESSIONID。它刪除了一些與用戶有關的其他cookie。

任何幫助,將不勝感激。

謝謝。

回答

2

您可能正在瀏覽從瀏覽器緩存中提供的頁面。您需要添加HTTP響應標頭,指示Web瀏覽器不緩存動態頁面。你可以用一個javax.servlet.Filter來做到這一點,該javax.servlet.Filter被映射在感興趣的<url-pattern>上,例如, *.jsf或事物並在doFilter()方法如下工作:

HttpServletResponse httpResponse = (HttpServletResponse) response; 
httpResponse.setHeader("Cache-Control", "no-cache,no-store,must-revalidate"); // HTTP 1.1 
httpResponse.setHeader("Pragma", "no-cache"); // HTTP 1.0 
httpResponse.setDateHeader("Expires", 0); // Proxies. 
chain.doFilter(request, response); 

不要忘記清除測試之前,瀏覽器緩存;)


無關的問題,if (session != null) nullcheck在你的代碼是多餘的,因爲當它到達nullcheck時,session永遠不會爲null。如果它爲空,它將在removeAttribute()調用中拋出NullPointerException,因此永遠不會到達空檢查。

+0

謝謝,這個伎倆。另外,我不得不在ec.redirect上進行導航。並感謝我的無效檢查點 - 如果我卡住了,我有時會忽略這些東西..:P – bahetivijay 2011-02-03 19:38:16