我有一个 JSF1.1 页面,其中包含几个命令链接。此页面在请求范围下运行。如果在会话超时发生之前单击命令链接的操作,则会正确触发它。但是如果在会话超时后单击它,则不会调用操作方法,单击它只会重新显示当前页面。
这是正常行为吗?有没有办法解决这个问题?
我有一个 JSF1.1 页面,其中包含几个命令链接。此页面在请求范围下运行。如果在会话超时发生之前单击命令链接的操作,则会正确触发它。但是如果在会话超时后单击它,则不会调用操作方法,单击它只会重新显示当前页面。
这是正常行为吗?有没有办法解决这个问题?
当会话超时时,会话 IDHttpServletRequest
将变为null
,因此它将无法实现其功能。
您可以实现一个filter
(这会为您在页面上的每次点击增加一些开销),以检查会话是否仍然有效。如果会话仍然有效,则允许处理继续进行,否则重定向回登录页面(或其他)。
下面是filter
.
public void doFilter(ServletRequest request,ServletResponse response, FilterChain filterChain) throws IOException,ServletException
{
if((request instanceof HttpServletRequest) && (response instanceof HttpServletResponse))
{
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
if (isSessionControlRequiredForThisResource(httpServletRequest)) {
// is session invalid?
if (isSessionInvalid(httpServletRequest)) {
String timeoutUrl = httpServletRequest.getContextPath() + "/" + getTimeOutPage();
httpServletResponse.sendRedirect(timeoutUrl);
return;
}
}
}
filterChain.doFilter(request, response);
}
private boolean isSessionControlRequiredForThisResource(HttpServletRequest httpServletRequest)
{
String requestPath = httpServletRequest.getRequestURI();
boolean controlRequired = !StringUtils.contains(requestPath, getTimeOutPage());
return controlRequired;
}
private boolean isSessionInvalid(HttpServletRequest httpServletRequest)
{
boolean sessionInValid = (httpServletRequest.getRequestedSessionId() != null)
&& !httpServletRequest.isRequestedSessionIdValid();
return sessionInValid;
}
不,这绝对不是正常行为。JSF 应该在ViewExpiredException
这里抛出一个而不是简单地重新显示页面。
JSF 1.1 是一个漏洞百出的版本。升级到最新的 JSF 1.2。自 2006 年左右发布 JSF 1.2 以来,JSF 1.1 的开发一直停滞不前。JSF 1.2 中修复了许多问题。任何 JSF 1.0/1.1 应用程序都可以毫无问题地升级到 JSF 1.2。仅当您的应用程序错误地依赖于某些 JSF 1.1 特定错误来正确行为时,您的应用程序可能仍会中断。所以你还是应该在升级后彻底测试。