Java JBoss集群上的JSF-SessionExpirationPhaseListener
我们得到了这个例外: TimeoutException:JBAS010213:无法获取锁定默认主机/ 我们在web应用程序中使用此PhaseListener来捕获ajax请求上的会话超时并重定向到索引(我们怀疑这可能与此有关,但我们不知道): } 我们运行的JBoss集群有2个节点(mod_cluster+apache),并且启用了SSO。 你们知道会出什么问题吗?或者至少给我们指出正确的方向 谢谢,Java JBoss集群上的JSF-SessionExpirationPhaseListener,java,jsf-2,jboss7.x,session-timeout,phaselistener,Java,Jsf 2,Jboss7.x,Session Timeout,Phaselistener,我们得到了这个例外: TimeoutException:JBAS010213:无法获取锁定默认主机/ 我们在web应用程序中使用此PhaseListener来捕获ajax请求上的会话超时并重定向到索引(我们怀疑这可能与此有关,但我们不知道): } 我们运行的JBoss集群有2个节点(mod_cluster+apache),并且启用了SSO。 你们知道会出什么问题吗?或者至少给我们指出正确的方向 谢谢, 关于。我认为这里的问题是两个节点试图访问同一会话,其中一个节点正在处理传入请求,而第二个节点正
关于。我认为这里的问题是两个节点试图访问同一会话,其中一个节点正在处理传入请求,而第二个节点正在执行会话过期 检查ajax调用中是否发送了Cookie,一个可能的问题是在不是会话所有者的节点中执行阶段侦听器 编辑:
存在此错误可能与此问题有关:您使用的jboss版本是什么?您是否启用了粘滞会话模式?Federico,我们正在使用JBoss EAP 6.3并启用粘滞会话模式。我们删除了SessionExpirationPhaseListener,但仍然存在。@Mateo请查看我添加到答案中的链接。第一个链接似乎与我们的场景非常相似,但是我不明白第二个问题。谢谢@Federico,读了这篇文章,我意识到在JBoss中将stickySessionsRemove设置为true可能是一个可行的解决方案。我们现在正在生产中进行测试。看看这个问题,也许在JBoss端使用max connections会有所帮助
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");
}
}
}