このトピックに関する多くの投稿を見てきましたが、私の場合はうまくいく解決策を得ることができませんでした.
JSF 2.0 で Java EE 6 を使用しています (JBoss AS 7.1 にデプロイ)
私web.xml
は持っています:
<session-config>
<session-timeout>1</session-timeout>
</session-config>
セッションが自動的にタイムアウトしたときに、ユーザーがログインページにリダイレクトされるようにします。
私が試したこと:
アプローチ 1: フィルターを使用する
次のフィルターを試しました。
@WebFilter()
public class TimeOutFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
System.out.println("filter called");
final HttpServletRequest req = (HttpServletRequest) request;
final HttpSession session = req.getSession(false);
if (session != null && !session.isNew()) {
chain.doFilter(request, response);
} else {
System.out.println("Has timed out");
req.getRequestDispatcher("/logon.xthml").forward(request, response);
}
}
@Override
public void destroy() {
}
}
web.xml
私が試した中で
<filter-mapping>
<filter-name>TimeOutFilter</filter-name>
<url-pattern>*.xhtml</url-pattern>
</filter-mapping>
と
<filter-mapping>
<filter-name>TimeOutFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
フィルターは、すべての要求で呼び出されると機能します (コンソールに "fiter called" のログが記録されます)。ただし、セッションがタイムアウトしても呼び出されません。
アプローチ 2: HttpSessionLister
を使用しようとしましたHttpSessionListerner
。次のシグネチャを持つメソッドが呼び出されます。
public void sessionDestroyed(HttpSessionEvent se) {
}
特定のページにリダイレクトできませんでした。ユーザーをリダイレクトしたいときは、通常NavigationHandler
from を使用しますFacesContext
が、この場合はFacesContext
( FacesContext.getCurrentInstance()
return null
) はありません。
この投稿によると、HttpListener はリクエストの一部ではないため、ユーザーをリダイレクトできません。
質問
この問題を解決する最善の方法は何ですか? 上記の 2 つのアプローチのいずれかを機能させるにはどうすればよいですか?