0

私はmyFaces2.1.7を実行していて、Webアプリケーションのmmeoryの使用法を必死に減らしようとしています。基本的に、各ユーザーのセッションサイズは最大10MBであり、処理できません。

Descriptorに以下を追加してみました。

        <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
 <----------------------------------------------------------------------------------------------------------------

上記のcontext-paramを削除すると、問題が修正されます。私の質問は1つです-

  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します。すぐにすべてのUATテスターがすべてのページの読み込み速度で劇的な速度低下を報告したため、に設定した状態に戻す必要がありました。STATE_SAVING_METHODclientSTATE_SAVING_METHODserver

org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSIONの値と現在の値6(デフォルトの20セッションから70%の改善)で実験してきたので、ViewExpiredExceptionエラーは発生しなくなりました(この質問が最初に作成された理由)

しかし、ある意味で私はロシアンルーレットをプレイしています。org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION3/4/5に設定した値が機能しなかった理由と、6が機能している理由がよくわかりません。そのため、説明できません。誰かが情報を提供できますか?

4

1 に答える 1

1

私は当初、ブラウザの[戻る]ボタンを使用するとViewExpired例外がスローされることに気付いた後にこの質問をしました。

また、デフォルト値の20org.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 に答える