另一个可能的答案:如果在 jsf 应用程序中发生会话超时,如何重定向到索引页面
另一个可能的答案:使用JSF PhaseListener
.
另外,我建议使用 aFilter
检查您的会话是否已经存在,如果没有,则重定向到您的自定义错误页面(我不记得我在哪里学到了这个方法,可能是通过 BalusC):
public class AuthenticationFilter implements Filter {
private FilterConfig config;
public void init(FilterConfig filterConfig) throws ServletException {
this.config = filterConfig;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if(((HttpServletRequest) request).getSession().getAttribute("some_attribute_you_store_in_Session") == null){
((HttpServletResponse)response).sendRedirect("yourCustomJSF.jsf");
}else{
chain.doFilter(request, response);
}
}
public void destroy() {
this.config = null;
}
// You also have to implement init() and destroy() methods.
}
然后,您必须在 web.xml 中声明此过滤器(以及将触发过滤器的 url 模式):
<filter>
<filter-name>AuthenticationFilter</filter-name>
<filter-class>yourPackage.AuthenticationFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthenticationFilter</filter-name>
<url-pattern>private.jsf</url-pattern>
</filter-mapping>
我将自己的 bean 存储在我的 JSF 会话中,这样我就可以保留我的用户信息。当过滤器在访问类时收到null
返回时,我知道会话已经失效(可能是因为它已经过期,或者只是用户已经注销)并且我将请求重定向到我的错误页面。