GBa*_*GBa 4 jsf login viewexpiredexception
好的简单问题.我有一个JSF应用程序,包含一个登录页面.问题是如果用户加载登录页面,离开它一段时间,然后尝试登录会话过期并抛出ViewExpiredException.当发生这种情况时,我可以重定向回登录,但这不是很顺利.如何在没有额外尝试的情况下允许此流程正确登录?
更新
从Mojarra 2.1.19/2.2.0开始,您现在可以将transient属性设置<f:view>为true:
<f:view transient="true">
Your regular content
</f:view>
Run Code Online (Sandbox Code Playgroud)
你可以在 这里阅读Balusc的博客:
http://balusc.blogspot.com.br/2013/02/stateless-jsf.html
原版的
如果您正在使用Facelets,您可以创建自己的ViewHandler来处理:
public class LoginViewHandler extends FaceletViewHandler
{
public LoginViewHandler( ViewHandler viewHandler )
{
super( viewHandler );
}
@Override
public UIViewRoot restoreView( FacesContext ctx, String viewId )
{
UIViewRoot viewRoot = super.restoreView( ctx, viewId );
if ( viewRoot == null && viewId.equals( "/login.xhtml" ) )
{
// Work around Facelet issue
initialize( ctx );
viewRoot = super.createView( ctx, viewId );
ctx.setViewRoot( viewRoot );
try
{
buildView( ctx, viewRoot );
}
catch ( IOException e )
{
log.log( Level.SEVERE, "Error building view", e );
}
}
return viewRoot;
}
}
Run Code Online (Sandbox Code Playgroud)
将"/login.xhtml"更改为您的登录页面.这将检查它是否可以恢复您的视图,如果它不能并且当前视图是您的登录页面,它将为您创建和构建视图.
在face-config.xml中设置如下:
<application>
<!-- snip -->
<view-handler>my.package.LoginViewHandler</view-handler>
</application>
Run Code Online (Sandbox Code Playgroud)
如果您正在使用没有Facelets的JSF(即JSP),您可以尝试让类扩展ViewHandlerWrapper - 请注意,buildView()将不可用.希望它自己的createView()会正确设置视图,但我不能100%肯定JSF/JSP.
| 归档时间: |
|
| 查看次数: |
4318 次 |
| 最近记录: |