使用AJAX时,是否可以判断哪个组件被点击导致ViewExpiredException
被抛出?如果用户只是尝试注销并向他显示正常的注销页面,我想避免显示会话过期页面。
我在考虑覆盖shouldHandleExceptionRootCause
,但我找不到任何可以识别是否按下了退出按钮的内容。
我使用的是Mojarra JSF 2.2和Omnifaces 2.5.1。
解决方案
@Override
protected boolean shouldHandleExceptionRootCause(FacesContext context, Throwable exception)
{
UIComponent source = Components.getCurrentActionSource();
if (source != null && "logout".equals(source.getId()))
{
NavigationHandler nh = context.getApplication().getNavigationHandler();
nh.handleNavigation(context, null, "logout.xhtml?faces-redirect=true");
return false;
}
else
{
return super.shouldHandleExceptionRootCause(context, exception);
}
}
答案 0 :(得分:1)
Components
实用程序类提供了几种方法来标识当前提交的表单,当前调用的命令和操作事件的源组件(可以是命令组件本身,但也可以是输入组件) ajax事件)。
UIForm form = Components.getCurrentForm();
UICommand command = Components.getCurrentCommand();
UIComponent source = Components.getCurrentActionSource();
接受你的选择。例如,您可以检查表单,命令或来源的id
,看看它是否是所需的。