我有一个JSF1.1页面,其中包含几个命令链接。此页面在请求范围下运行。如果在会话超时发生之前单击它,则会正确触发命令链接的操作。但如果在会话超时后单击它,则不会调用action方法并单击它只是重新显示当前页面。
这是正常行为吗?有办法解决这个问题吗?
答案 0 :(得分:0)
当会话超时时,HttpServletRequest
中的会话ID将变为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;
}
答案 1 :(得分:0)
不,这绝对不是正常行为。 JSF应该在这里抛出ViewExpiredException
而不是简单地重新显示页面。
JSF 1.1是一个非常错误的版本。 Upgrade到最新的JSF 1.2。自从JSF 1.2在2006年左右发布以来,JSF 1.1开发已经停滞不前.JSF 1.2中修复了许多问题。任何JSF 1.0 / 1.1应用程序都可以升级到JSF 1.2而不会出现重大问题。只有当您的应用程序错误地依赖某些JSF 1.1特定的错误才能成为正确的行为时,您的应用程序可能仍然会中断。因此,升级后仍应进行彻底测试。