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

显然,如果我清除会话属性,它将全部消失,但我不想这样做,还有其他方法吗?

使用

  • 特立尼达-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_CACHE以下init paramsinweb.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 回答