当我们确定不再需要它时,如何从 session 中清除 pageFlowScopes 和 View 缓存?
以下操作清除当前请求上下文中的 pageFlowScope
映射
RequestContext requestContext = RequestContext.getCurrentInstance();
requestContext.getPageFlowScope().clear();
但是,如果我转储 http-session 属性
,我仍然会在 session 中看到许多 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
显然,如果我清除 session 属性,它就会消失,但我不想这样做,还有其他方法吗?
使用
- trinidad-api-1.0.10.jar
- myfaces-impl-1.1.5.jar
编辑
还观察到以下属性永远保留在 session 中,并且内容随着时间的推移而增长
org.apache.myfaces.trinidadinternal.Change
最佳答案
PageFlowScope
如果不打算使用多个 pageflowscope,则可以更改 trinidad-config.xml
中的以下条目
<page-flow-scope-lifetime>1</page-flow-scope-lifetime>
这将控制 session 中保存的org.apache.myfaces.trinidadinternal.application.PageFlowScope
的数量。
VIEW_CACHE
如果不打算使用 VIEW_CACHE
,可以将 web.xml
中的以下 init params
配置为最小值。
<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>
这将控制 session 中保存的 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);
}
}
}
关于java - 如何从 session 中清除所有 pageFlowScope map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8230660/