java - 如何从 session 中清除所有 pageFlowScope map ?

标签 java jsf session-variables myfaces trinidad

当我们确定不再需要它时,如何从 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/

相关文章:

c# - 临时存储特定用户的对话

java - 如何在数据库中存储当前登录的用户?

session-variables - OWIN 自主机中等效的 session 变量

PHP MySQL 设置 session 从 MySQL 生成的表提交

java - 使用 Java 7/Eclipse 3.7.1 的 headless pde 构建失败

java - 如何在 Web 应用程序中实现自动注销?

javascript - 两个几乎相同的页面之一缺少 CSS 和 Javascript

java - 如何在 java 中清除控制台(使用 netbeans)

java - 以编程方式设置 Keyboard.Key 图标

java - 使用 NewGlobalRef 时的 JNI "local reference table overflow"