0

我正在运行 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? 

PS 在测试为什么会发生这种情况时,如果我打开例如 IE 并尝试登录一切正常,但是如果我尝试打开另一个浏览器(例如 chrome)并使用另一个用户名登录,则遇到用户报告的镜像问题不是能够登录。

同样遵循 myFaces wiki 的提示,我在描述符中添加了以下内容,但我认为它不会导致问题:

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

更新:

正如我所建议的那样,BalusC我将其更改为STATE_SAVING_METHODclient解决我们遇到的内存问题。立即所有 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 起作用,这让我无法解释它感到困扰。有没有人可以提供信息?

4

1 回答 1

1

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

我还将默认值 20 降低org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION 到 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>
于 2012-06-10T17:16:34.730 回答