MOD_CLUSTER - 删除粘性会话
MOD_CLUSTER - remove sticky session
我正在使用 mod_cluster 版本 1.2.11.Final 以及 JBoss AS 7.2.0.Final(独立-ha-完整模式)
mod_cluster 设置为启用了粘性会话,我们通常同时拥有 2 或 3 个 JBoss 服务器 运行,并且每天晚上轮换服务器以部署更新
当我们想要关闭 JBoss 服务器时,我们使用 CLI 命令禁用该节点的所有上下文..
/subsystem=modcluster/:disable-context(virtualhost=my-webapp,context=/)
这会停止将任何新会话路由到节点 ok
然后我们等待 30 分钟,但有时过了这个时间仍有一些会话处于活动状态
我已经尝试强制他们注销并从这些用户的响应中删除 JSESSIONID cookie,但他们仍然被路由回同一个 JBoss 节点(他们被发布了一个新的 JSESSIONID)
是否可以命令 mod_cluster 删除这些粘性会话?....或强制将它们交给另一个工作人员?
(我知道我可以取消部署应用程序,但有时当有很多活动会话剩余时,这会导致另一台服务器因需求突然激增而崩溃)
期待听到您的建议
对于遇到此问题的任何其他人,我通过为路径 /logout 注册 @WebFilter 创建了一个解决方法,在此过滤器中我使会话无效并删除 JSESSIONID cookie,然后我使用查询传递重定向 URI参数。用户被移动到另一个 JBoss 节点并重定向到他们的原始页面。您只需要在检测到节点关闭时将它们重定向到 /logout。
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
session.invalidate();
String redirectUri = "/index.xhtml";
if(request.getParameterMap().containsKey("redirect")) {
String[] vals = request.getParameterMap().get("redirect");
if(vals.length>0) {
redirectUri = vals[0];
}
}
Cookie[] userCookies = request.getCookies();
if (userCookies != null && userCookies.length > 0 ) {
for (int i = 0; i < userCookies.length; i++) {
if(userCookies[i].getName().equals("JSESSIONID")) {
Cookie jSessionId = userCookies[i];
jSessionId.setMaxAge(0);
response.addCookie(jSessionId);
}
}
}
response.sendRedirect(redirectUri);
}
我正在使用 mod_cluster 版本 1.2.11.Final 以及 JBoss AS 7.2.0.Final(独立-ha-完整模式)
mod_cluster 设置为启用了粘性会话,我们通常同时拥有 2 或 3 个 JBoss 服务器 运行,并且每天晚上轮换服务器以部署更新
当我们想要关闭 JBoss 服务器时,我们使用 CLI 命令禁用该节点的所有上下文..
/subsystem=modcluster/:disable-context(virtualhost=my-webapp,context=/)
这会停止将任何新会话路由到节点 ok
然后我们等待 30 分钟,但有时过了这个时间仍有一些会话处于活动状态
我已经尝试强制他们注销并从这些用户的响应中删除 JSESSIONID cookie,但他们仍然被路由回同一个 JBoss 节点(他们被发布了一个新的 JSESSIONID)
是否可以命令 mod_cluster 删除这些粘性会话?....或强制将它们交给另一个工作人员?
(我知道我可以取消部署应用程序,但有时当有很多活动会话剩余时,这会导致另一台服务器因需求突然激增而崩溃)
期待听到您的建议
对于遇到此问题的任何其他人,我通过为路径 /logout 注册 @WebFilter 创建了一个解决方法,在此过滤器中我使会话无效并删除 JSESSIONID cookie,然后我使用查询传递重定向 URI参数。用户被移动到另一个 JBoss 节点并重定向到他们的原始页面。您只需要在检测到节点关闭时将它们重定向到 /logout。
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
session.invalidate();
String redirectUri = "/index.xhtml";
if(request.getParameterMap().containsKey("redirect")) {
String[] vals = request.getParameterMap().get("redirect");
if(vals.length>0) {
redirectUri = vals[0];
}
}
Cookie[] userCookies = request.getCookies();
if (userCookies != null && userCookies.length > 0 ) {
for (int i = 0; i < userCookies.length; i++) {
if(userCookies[i].getName().equals("JSESSIONID")) {
Cookie jSessionId = userCookies[i];
jSessionId.setMaxAge(0);
response.addCookie(jSessionId);
}
}
}
response.sendRedirect(redirectUri);
}