如何在JSF中使当前会话的视图无效



我们有一个应用程序(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();

最新更新