1

不要になったことが確実な場合に、pageFlowScopesをクリアしてセッションからキャッシュを表示するにはどうすればよいですか?

pageFlowScope以下は、現在のリクエストコンテキストでマップをクリアします

    RequestContext requestContext = RequestContext.getCurrentInstance();
    requestContext.getPageFlowScope().clear();

しかし、ダンプした場合でも、セッション中にhttp-session attributes多くのインスタンスが表示されますPageFlowscopes

org.apache.myfaces.trinidadinternal.application.PageFlowScope.ois6p8lk1 
org.apache.myfaces.trinidadinternal.application.PageFlowScope.ois6p8lk2 
org.apache.myfaces.trinidadinternal.application.PageFlowScope.ois6p8lk3 

キャッシュも表示します

org.apache.myfaces.trinidadinternal.application.VIEW_CACHE.1qvzgdgkw
org.apache.myfaces.trinidadinternal.application.VIEW_CACHE.2qvzgdgkw
org.apache.myfaces.trinidadinternal.application.VIEW_CACHE.3qvzgdgkw

明らかに、セッション属性をクリアすると、すべて消えますが、それはしたくありません。他の方法はありますか?

使用する

  • trinidad-api-1.0.10.jar
  • myfaces-impl-1.1.5.jar

編集

また、次の属性はセッションに永久に保持され、コンテンツは時間の経過とともに大きくなります。

org.apache.myfaces.trinidadinternal.Change
4

1 に答える 1

1

PageFlowScope

複数のページフロースコープを使用する予定がない場合は、次のエントリをtrinidad-config.xml変更できます

<page-flow-scope-lifetime>1</page-flow-scope-lifetime>

これによりorg.apache.myfaces.trinidadinternal.application.PageFlowScope、セッション中に保持される数が制御されます。


VIEW_CACHE

使用する予定がない場合は、最小値に設定できますVIEW_CACHEinit paramsweb.xml

<context-param>
    <param-name>org.apache.myfaces.trinidad.CLIENT_STATE_MAX_TOKENS</param-name>
    <param-value>1</param-value>
</context-param>    

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

org.apache.myfaces.trinidadinternal.application.VIEW_CACHEこれにより、セッション中に保持される数を制御できます


trinidadinternal.Change

これを回避する方法が見つかりませんでした。


クリーンアップに次の方法を使用することになりました

@SuppressWarnings("unchecked")
public static Map<String, Object> getSessionMap() {
    FacesContext context = FacesContext.getCurrentInstance();
    return context.getExternalContext().getSessionMap();
}


private void clearMyfacesSessionAttributes() {
    RequestContext requestContext = RequestContext.getCurrentInstance();
    requestContext.getPageFlowScope().clear();
    Map<String, Object> sessionMap = getSessionMap();
    Set<Map.Entry<String, Object>> entrySet = sessionMap.entrySet();
    for (Map.Entry<String, Object> entry : entrySet) {
        String key = entry.getKey();
        if(key.contains("org.apache.myfaces.trinidadinternal.application.VIEW_CACHE")
                || key.contains("org.apache.myfaces.trinidadinternal.application.PageFlowScope")
                || key.contains("org.apache.myfaces.trinidadinternal.Change"))
        {
            sessionMap.remove(key);
        }
    }
}
于 2011-11-30T15:22:48.720 に答える