减少NUMBER_OF_VIEWS_IN_SESSION会导致ViewExpiredException

时间:2012-05-08 02:39:29

标签: jsf myfaces

我正在运行myFaces 2.1.7并且不顾一切地试图减少我们的Web应用程序的使用情况。基本上每个用户气球的会话大小高达10MB,这是我们无法处理的。

我尝试将以下内容添加到描述符中:

        <context-param>
            <param-name>org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION</param-name>
            <param-value>3</param-value>
        </context-param>

结果还可以,任何给定用户的会话大小都不会高于1MB。但是,自更改以来,很多用户都无法登录。发生的事情是,在登录屏幕上抛出了ViewExpiredException,我编写了一个自定义的viewExpiredException类,将用户重定向回登录界面,所以基本上它们都停留在登录屏幕循环上

 try to log in ---> ViewExpiredException thrown --->  Custom ViewExpiredHandler ----> Forward user to Login Screen
 <----------------------------------------------------------------------------------------------------------------

删除上述上下文参数可以解决问题!我的问题是一个 -

  1) why is the viewException is thrown when the NUMBER_OF_VIEWS_IN_SESSION is reduced from its default value 
  2) is it possible to work around the issue by using the custom ViewExpiredHandler class ? how?
  3) am i doing something wrong in causing this issue? 

P.S。在测试为什么会发生这种情况,如果我打开例如IE并尝试登录所有都可以,但是如果我尝试打开另一个浏览器(例如chrome)并使用上面的其他用户名登录问题会遇到镜像问题用户报告不是能够登录。

另外,根据myFaces维基的提示,我已将以下内容添加到描述符中,但我认为它不会导致此问题:

<context-param>
    <param-name>org.apache.myfaces.SERIALIZE_STATE_IN_SESSION</param-name>
    <param-value>false</param-value>
</context-param> 

更新

根据BalusC的建议,我将STATE_SAVING_METHOD更改为client,以解决我们遇到的内存问题。所有UAT测试人员立即报告所有页面加载速度显着减慢,因此我不得不恢复为STATE_SAVING_METHOD设置为server

由于我一直在试验org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION的价值和6的当前值(比默认的20个会话提高了70%),我没有得到ViewExpiredException错误。(最初创建此问题的原因)

但在某种程度上我正在玩俄罗斯轮盘赌。我真的不知道为什么将org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION的值设置为3/4/5不起作用以及为什么6正在工作并且困扰我无法解释它。有人能够提供信息吗?

1 个答案:

答案 0 :(得分:1)

在注意到浏览器的BACK按钮的使用是如何导致抛出ViewExpired Exception之后,我最初问过这个问题。

我还将org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION的默认值20减少到3然后减少了6(尝试记忆足迹),这加剧了问题。

编写了一个ViewExpired异常处理程序后,我现在正在寻找一种方法来处理抛出它时的异常,以下是我如何处理它:

    1 - `org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION ` value is 6

    2 - when ViewExpired Exception is thrown in ViewExpired Handler retrieve the request URL
            HttpServletRequest orgRequest = (HttpServletRequest) fc.getExternalContext().getRequest();

    3 - insert a boolean into user session (used as flag to be used below)
                Map<String, Object> sessionMap = FacesContext.getCurrentInstance()
                        .getExternalContext().getSessionMap();
                sessionMap.put("refreshedMaxSesion",true);

    4 - redirect back to URL retrieved in step 2
                   fc.getExternalContext().redirect(orgRequest.getRequestURI());

    5 - Since page is reloaded , see if the flag in step 3 exists and if so flag a notification to be shown to user and remove from session
                 if(sessionMap.containsKey("refreshedMaxSesion")){
            showPageForceRefreshed = true;
            sessionMap.remove("refreshedMaxSesion");
        }

    6 - I'm using Pines Notify to show subtle "FYI, this page way refreshed" type message".
           <h:outputText rendered="#{ myBean.showPageForceRefreshed }" id="PageWasRefreshedInfoId" >
                <script type="text/javascript">
                    newjq(document).ready(function(){
                        newjq.pnotify({
                            pnotify_title: 'Info',
                            pnotify_text: 'Ehem, Page was Refreshed.' ,
                            pnotify_mouse_reset: false,
                            pnotify_type: 'info',
                            pnotify_delay: 5000
                        });
                    });
                </script>
            </h:outputText>