1

我有一个 JSF1.1 页面,其中包含几个命令链接。此页面在请求范围下运行。如果在会话超时发生之前单击命令链接的操作,则会正确触发它。但是如果在会话超时后单击它,则不会调用操作方法,单击它只会重新显示当前页面。

这是正常行为吗?有没有办法解决这个问题?

4

2 回答 2

0

当会话超时时,会话 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;
    }
于 2013-04-19T04:38:53.533 回答
0

不,这绝对不是正常行为。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 特定错误来正确行为时,您的应用程序可能仍会中断。所以你还是应该在升级后彻底测试。

也可以看看:

于 2013-04-19T12:22:57.247 回答