我们有一个应用程序(Mojarra 2.3(,用户可以在其中更改其看到的数据的全局过滤器。当这种情况发生时,我想保留会话,但使活动视图(服务器端(无效。
我发现了一个问题,可以让你计算浏览量:我如何计算用户的浏览量';JSF会话(JSF 2.2(?
基于此,我认为我可以删除存储视图的属性。我想出了这个方法:
public static void invalidateViews() {
final HttpSession session = Faces.getSession();
List.of("com.sun.faces.application.view.activeViewContexts",
"com.sun.faces.application.view.activeViewMaps",
"com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap",
"org.jboss.weld.context.ConversationContext.conversations")
.forEach(session::removeAttribute);
Faces.redirect(Faces.getRequest().getRequestURL().toString());
}
链接问题的答案中提到了com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap
。我有点猜测,删除其他属性不会有什么坏处。答案还提到,它只是Mojarra。
到目前为止,它似乎是有效的,但我想问:是否应该这样清除服务器端视图?如果是,我该如何支持MyFaces?
到目前为止似乎还可以,但我想问一下:是否应该这样清除服务器端视图?
考虑到没有标准的API调用,这是你能做的最好的事情,是的。在JSF2.3工作期间,我请求在标准API中提供该功能的更具体的变体,因为我需要能够销毁与特定JSF视图状态相关联的视图范围的bean(有关OmniFaces视图范围卸载功能,请参阅Hacks#removeViewState()
(。但不幸的是,由于Portlet的困难,这一点尚未得到充实。
如果是,我如何也支持MyFaces?
如OmniFacesHacks
助手类中所示,MyFaces 2.x的会话属性键为org.apache.myfaces.application.viewstate.ServerSideStateCacheImpl.SERIALIZED_VIEW
和4.xorg.apache.myfaces.application.viewstate.StateCacheServerSide.SERIALIZED_VIEW
。
顺便说一下,
Faces.redirect(Faces.getRequest().getRequestURL().toString());
这更短:
Faces.refreshWithQueryString();