MOD_CLUSTER - удалить липкую сессию - PullRequest
0 голосов
/ 14 февраля 2019

Я использую mod_cluster версии 1.2.11. Финал вместе с JBoss AS 7.2.0. Финал (автономный-полный-режим)

mod_cluster настроен с включенными липкими сессиями, у нас обычно 2 или 3Серверы JBoss работают одновременно и каждый вечер меняют серверы для развертывания обновлений

Когда мы хотим выключить сервер JBoss, мы отключаем все контексты для этого узла с помощью команды CLI.

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

Это останавливает все новые сеансы, перенаправляемые на узел ok

Затем мы ждем 30 минут, но иногда после этого времени некоторые активные сеансы все еще активны

Я пытался заставить их выйти из системы, а также удалитьфайл cookie JSESSIONID из ответов этих пользователей, но они все еще направляются обратно на тот же узел JBoss (они выпускаются с новым JSESSIONID)

Можно ли с помощью команды mod_cluster удалить эти липкие сеансы? ..... или заставить их другому работнику?

(я знаю, что могу просто удалить приложение, но иногда, когда есть всеиз-за оставшихся активных сеансов это приводит к сбою другого сервера при внезапном росте спроса)

Ждем ваших предложений

1 Ответ

0 голосов
/ 13 августа 2019

Для тех, у кого возникла эта проблема, я создал обходной путь, зарегистрировав @WebFilter для пути / выхода из системы, в этом фильтре я делаю недействительным сеанс и удаляю cookie JSESSIONID, затем я передаю 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);

    }
...