2011-04-11 26 views
55

在JSF 2.0應用程序中使會話失效的最佳方式是什麼?我知道JSF本身不處理會話。到目前爲止,我能找到如何在JSF 2.0中使會話失效?

private void reset() { 
    HttpSession session = (HttpSession) FacesContext.getCurrentInstance() 
      .getExternalContext().getSession(false); 
    session.invalidate(); 
} 
  1. 這是方法正確嗎?有沒有方法可以觸摸到ServletAPI?
  2. 考慮一個場景,其中@SessionScoped UserBean處理登錄 - 註銷用戶的 。我在同一個bean中有這個方法。在我完成必要的DB 更新之後,當我調用reset()方法時,現在有 更新,我當前的會話scoped bean會發生什麼情況?因爲 連豆本身都存儲在HttpSession

回答

117

首先,該方法是否正確?有沒有觸摸ServletAPI的方法?

您可以使用ExternalContext#invalidateSession()使會話無效,而無需獲取Servlet API。

@ManagedBean 
@SessionScoped 
public class UserManager { 

    private User current; 

    public String logout() { 
     FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); 
     return "/home.xhtml?faces-redirect=true"; 
    } 

    // ... 

} 

會發生什麼事我當前的會話範圍豆?因爲即使這個bean本身存儲在HttpSession中?

它仍然可以在當前響應中訪問,但在下一個請求中它不會再存在。因此,在無效之後重新引導重定向(新請求)非常重要,否則您仍然會顯示舊會話中的數據。可以通過將faces-redirect=true添加到結果來完成重定向,就像我在上面的例子中所做的那樣。發送重定向的另一種方式是使用ExternalContext#redirect()

public void logout() throws IOException { 
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); 
    ec.invalidateSession(); 
    ec.redirect(ec.getRequestContextPath() + "/home.xhtml"); 
} 

然而,在使用導航結果更簡單的情況下,它的使用是有問題的。

+1

@BalusC,'ExternalContext#invalidateSession()'和'HttpSession#invalidate()'有什麼區別? – Patrick 2015-04-03 15:48:11

+5

@帕特里克:從功能上來說,什麼都沒有。他們都完全一樣。 'ExternalContext#invalidateSession()'調用覆蓋HttpSession#invalidate()'(另請參閱我的答案中的javadoc鏈接)。設計技術上來說,'ExternalContext'方法更好。你應該基本上努力在你的任何JSF相關構件中有**零**'javax.servlet。*'導入。 – BalusC 2015-04-03 15:57:11

12
public void logout() { 
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); 
}