MOD_CLUSTER-删除粘性会话

时间:2019-02-14 15:57:04

标签: jboss jboss7.x java-ee-7 mod-cluster

我使用的是mod_cluster版本1.2.11.Final和JBoss AS 7.2.0.Final(独立-完整模式)

mod_cluster已设置为启用粘性会话,我们通常同时运行2或3个JBoss服务器,并每天晚上旋转服务器以部署更新

当我们想关闭JBoss服务器时,我们使用CLI命令禁用该节点的所有上下文。

/subsystem=modcluster/:disable-context(virtualhost=my-webapp,context=/)

这将停止将新会话路由到ok节点

然后我们等待30分钟,但有时在这段时间之后,仍有一些会话处于活动状态

我试图强迫他们注销,并从这些用户的响应中删除JSESSIONID cookie,但是它们仍然被路由回相同的JBoss节点(向它们发出新的JSESSIONID)

是否可以命令mod_cluster删除这些粘性会话?....或将其强制给其他工作人员?

(我知道我可以取消部署该应用程序,但是有时候当剩余大量活动会话时,这会导致另一台服务器因需求的突然激增而崩溃)

期待听到您的建议

1 个答案:

答案 0 :(得分:0)

对于其他有此问题的人,我通过在路径/ 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);

    }