JSF - SessionExpirationPhaseListener上一个JBoss集群
问题描述:
我们得到此异常:JSF - SessionExpirationPhaseListener上一个JBoss集群
TimeoutException异常:JBAS010213:无法获得锁默认主机/ ...
我们使用这些的PhaseListener在我们的网页应用程序捕获会话超时的Ajax请求,并重定向到索引(我们怀疑这可能是相关的,但我们不知道):
public class SessionExpirationPhaseListener implements PhaseListener {
@Override
public PhaseId getPhaseId() {
return PhaseId.RESTORE_VIEW;
}
@Override
public void beforePhase(PhaseEvent event) {
}
@Override
public void afterPhase(PhaseEvent event) {
FacesContext context = FacesContext.getCurrentInstance();
HttpServletRequest httpRequest = (HttpServletRequest) context.getExternalContext().getRequest();
if (httpRequest.getRequestedSessionId() != null && !httpRequest.isRequestedSessionIdValid()) {
String facesRequestHeader = httpRequest.getHeader("Faces-Request");
boolean isAjaxRequest = facesRequestHeader != null && facesRequestHeader.equals("partial/ajax");
// navigate to home page only for ajax requests
if (isAjaxRequest) {
ConfigurableNavigationHandler handler = (ConfigurableNavigationHandler) context.getApplication().getNavigationHandler();
handler.performNavigation("home");
}
}
}
}
我们正在运行一个带有2个节点(mod_cluster + apache)的JBoss群集并启用了SSO。 你们知道什么可能是错的吗?或者至少将我们指向正确的方向?
谢谢, 关心。
答
我相信这里的问题是两个节点试图访问同一个会话,其中一个节点正在处理传入请求,而第二个节点正在执行会话过期。
检查Cookie正在您的ajax调用中发送,可能的问题是在不是会话拥有者的节点中执行阶段侦听器。
编辑:
可能存在关联到这个问题,这个bug:https://bugzilla.redhat.com/show_bug.cgi?id=993041
您正在使用什么版本的JBoss?你是否启用了粘滞会话模式? – 2014-10-30 22:42:04
Federico,我们正在使用JBoss EAP 6.3并启用粘滞会话模式。 – Mateo 2014-10-31 12:22:42