gpt4 book ai didi

java - 使用自定义 ViewHandler 处理登录页面上的 ViewExpiredException

转载 作者:行者123 更新时间:2023-11-29 09:11:37 27 4
gpt4 key购买 nike

在我的网络应用程序中,当 session 过期并且用户发起请求(完整页面或 AJAX)时,用户将被重定向到登录页面,并显示 session 已过期的消息。问题是,当登录页面保持打开的时间足够长以致 session 过期并且用户尝试登录时,用户将被重定向到登录页面,并显示一条 session 已过期的消息。

我遇到了 this solution ,但它适用于 JSF 1.x,不适用于 JSF 2。所以我开始构建自己的:

public class LoginViewHandler extends ViewHandler
{
public LoginViewHandler(ViewHandler parent)
{
this.parent = parent;
}

@Override
public Locale calculateLocale(FacesContext context)
{
return parent.calculateLocale(context);
}

@Override
public String calculateRenderKitId(FacesContext context)
{
return parent.calculateRenderKitId(context);
}

@Override
public UIViewRoot createView(FacesContext context, String viewId)
{
return parent.createView(context, viewId);
}

@Override
public String getActionURL(FacesContext context, String viewId)
{
return parent.getActionURL(context, viewId);
}

@Override
public String getResourceURL(FacesContext context, String path)
{
return parent.getResourceURL(context, path);
}

@Override
public void renderView(FacesContext context, UIViewRoot viewToRender)
throws IOException, FacesException
{
parent.renderView(context, viewToRender);
}

@Override
public UIViewRoot restoreView(FacesContext context, String viewId)
{
UIViewRoot viewRoot = parent.restoreView(context, viewId);

if (viewRoot == null && viewId.equals("/login.xhtml"))
{
parent.initView(context);

viewRoot = parent.createView(context, viewId);
context.setViewRoot(viewRoot);

try
{
buildView(context, viewRoot); // Compile error!
}
catch (IOException e)
{
log.log(Level.SEVERE, "Error building view", e);
}
}

return viewRoot;
}

@Override
public void writeState(FacesContext context) throws IOException
{
parent.writeState(context);
}

private ViewHandler parent;
}

但是,没有名为buildView 的方法。我不确定它的作用,为什么需要它以及我应该用什么来代替它。有什么想法吗?

最佳答案

已移至ViewDeclarationLanguage#buildView()因为此步骤与所使用的 View 技术(Facelets、JSP、JavaVDL 等)分离。

context.getApplication().getViewHandler()
.getViewDeclarationLanguage(context, viewId).buildView(context, viewRoot);

顺便说一下,扩展 ViewHandlerWrapper 更简单反而。这样您就不需要那一堆委托(delegate)方法。

关于java - 使用自定义 ViewHandler 处理登录页面上的 ViewExpiredException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12048067/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com