我們的Web應用程序使用JBoss 7.1.1和Java(JPA2和RichFaces4)運行。目前的問題是,如果用戶登錄但應用程序內沒有執行任何操作一段時間(可能是由於會話超時引起的),則應用程序會卡住。然後,用戶必須再次加載Web應用程序,這看起來不太專業。如何在Web應用程序中實現自動註銷?
你能給我一個提示,說明如何使用上述技術實現自動註銷嗎?
[UPDATE]
我嘗試了很多的可能性,但沒有一個能正常工作。我的想法是實現一個SessionTimeoutListener,它知道會話何時過期:
@Logged
@WebListener
@Named
public class SessionTimeoutListener implements HttpSessionListener
{
@Inject
private Logger logger;
@Override
public void sessionCreated(HttpSessionEvent event)
{
// not used.
}
@Override
public void sessionDestroyed(HttpSessionEvent event)
{
logger.info("Session destroyed.");
ApplicationContext.setAutoLoggedOut(true);
}
}
This works。但是,然後出現所有問題:我無法重定向,因爲FacesContext在那裏爲空。我無法觸發push events,因爲我得到了一些例外,如NameNotFoundException或類似的(我嘗試了很多,但似乎射擊事件也無法解決這個問題)。然後,我嘗試了ApplicationContext.isAutoLoggedOut()上的a4j:poll,但這也不起作用,因爲如果我執行輪詢事件,會話永遠不會過期。我總是走到死衚衕。如果我可以從SessionTimeoutListener以某種方式重定向,這將是解決方案。
[可能的解決方案]
我現在很滿意,當我在視圖中的任何按鈕單擊會話過期之後執行註銷。目前這種解決方案只是基本的,並且不適用於生產,但是這個解決方案很有效,我將在此基礎上構建: 我使用上層的SessionTimeoutListener。此外,我使用了SessionTimeoutListener之後調用的PhaseListener,因此如果會話過期,SessionTimeoutListener將被調用並銷燬會話,但SessionTimeoutPhaseListener仍具有FacesContext。所以,我也可以把那裏註銷頁:
public class SessionTimeoutPhaseListener implements PhaseListener
{
private static final long serialVersionUID = -8603272654541248512L;
@Override
public void beforePhase(PhaseEvent event)
{
//not used.
}
@Override
public void afterPhase(PhaseEvent event)
{
FacesContext facesContext = event.getFacesContext();
if (ApplicationContext.isAutoLoggedOut())
{
ApplicationContext.setAutoLoggedOut(false);
try
{
facesContext.getExternalContext().redirect("./logout.xhtml");
}
catch (IOException e)
{
}
}
}
@Override
public PhaseId getPhaseId()
{
return PhaseId.RESTORE_VIEW;
}
}
ApplicationContext已與@ApplicationScoped存儲布爾變量的一類,但是這必須要改變,因爲它會影響到誰目前與該應用程序的每個用戶。我想了解一些「ThreadLocal上下文」來解決這個問題。我仍然必須區分自動註銷和手動註銷。偵聽器在兩種情況下都被調用。儘管此解決方案目前工作,但PhaseListener中的重定向也非常棘手,因爲如果我不將「autoLoggedOut」設置爲false,它將被JSF一遍又一遍地調用(導致瀏覽器中出現重定向循環錯誤)。 ..正如我所說,只是基本的,但使用PhaseListener可能是唯一合適的解決方案。
我不明白。會話超時是自動註銷。你的意思是「用戶必須重新加載Web應用程序」。它應該在會話超時後重定向到登錄頁面。 –