会话超时后未触发的JSF 1.1请求范围命令链接操作

时间:2013-04-18 20:11:40

标签: jsf

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

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

2 个答案:

答案 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特定的错误才能成为正确的行为时,您的应用程序可能仍然会中断。因此,升级后仍应进行彻底测试。

另见: