我一直在使用JSF1.2的登录页面。 如果用户坐太久(超时situatation)在登录页面,然后尝试进入失败与错误ViewExpired ID和密码(即使ID /密码是正确的)。 这一切都使得从JSF透视感觉给我。 我的解决方案是简单地使用客户端javax.faces.STATE_SAVING_METHOD。 但是,这感觉就像一个黑客攻击。
我的应用程序迁移到JSF2.0。 我想我的应用程序返回到服务器STATE_SAVING_METHOD。 但我的要求是,如果正确的ID和密码提交的应用程序会接受它。
我的另一个解决方案是简单地使用servlet,而不是使用JSF用于登录处理。 但似乎所有的ugprades到JSF2.0,有可能是现在可用的东西。
任何想法将不胜感激。 谢谢。
您可以手动创建和构建视图时恢复视图返回null
时回传 。 您可以在自定义做到这一点ViewHandler
。 这里有一个开球例如:
public class RestorableViewHandler extends ViewHandlerWrapper {
private ViewHandler wrapped;
public RestorableViewHandler(ViewHandler wrapped) {
this.wrapped = wrapped;
}
@Override
public UIViewRoot restoreView(FacesContext context, String viewId) {
UIViewRoot restoredView = wrapped.restoreView(context, viewId);
if (!(restoredView == null && context.isPostback())) {
return restoredView;
}
UIViewRoot createdView = createView(context, viewId);
context.setViewRoot(createdView);
try {
getViewDeclarationLanguage(context, viewId).buildView(context, createdView);
} catch (IOException e) {
throw new FacesException(e);
}
return createdView;
}
@Override
public ViewHandler getWrapped() {
return wrapped;
}
}
您可能要延长if
有检查检查viewId
代表登录页面。
为了得到它的运行,如在下面进行注册faces-config.xml
:
<application>
<view-handler>com.example.RestorableViewHandler</view-handler>
</application>
然而有技术的局限性:重新创建的视图是,正是因为它是最初请求期间是相同的,所以任何修改JSF组件树,其此后被制成,或者通过taghandlers或有条件基于一些视图或呈现部件甚至会话范围变量,完全丧失。 为了准确地重建所需的视图,你需要确保这些修改是根据要求订做范围变量(读:请求参数),而不是观点或会话范围的变量。
换句话说,该视图的状态不应该依赖于视图或会话范围的托管bean,而纯粹是在请求范围管理的Bean。
更新 :该OmniFaces JSF工具库具有在当前1.3快照在风味一个可重复使用的溶液<o:enableRestorableView>
其中可以嵌入<f:metadata>
。 另请参见<o:enableRestorableView>
上的快照现场展示页面进行演示。
这里有几个的,你可以使用的选项:
允许用户后会话超时登录了JSF 2.0
(如果你是开放的使用他们,你可以使用一个组件PrimeFaces。) http://www.primefaces.org/showcase/ui/idlemonitorHome.jsf
我还没有尝试过,但我认为这实际上是新的JSF功能“无国籍意见”的理想应用。
只需设置“瞬间”在JSF的观点:
<f:view transient="true">
...content...
</f:view>
一个很好的解释是在这里:
http://balusc.blogspot.de/2013/02/stateless-jsf.html
也看到了这个问题: 什么是无国籍的JSF用处?
不幸的是,该功能仅适用于钻嘴鱼科V2.1(和MyFaces的2.2)可用,因此您可能需要从2.0升级。