Перенаправление перестало работать через некоторое время на производстве

Я столкнулся с очень странной проблемой только на производственном сервере.

Я использую SAP Hybris, использующий безопасность Spring.

Когда пользователь пытается получить доступ к любому защищенному URL-адресу сайта, он перенаправляется на страницу входа, как только он входит в систему, он перенаправляет обратно на URL-адрес, к которому он пытался получить доступ раньше. Это ожидаемое поведение.

Теперь на производственных узлах витрины он работает нормально в течение некоторого времени (скажем, около 30 минут), когда я перезапускаю сервер. А потом перестало работать. После входа в систему пользователь перенаправляется на домашнюю страницу вместо защищенного URL-адреса, к которому он пытался получить доступ.

Примечание. Он работает абсолютно нормально во всех нижних средах (Local, DEV, Stage и т. д.).

Любая идея? Ваша помощь будет оценена по достоинству!


Изменить: - Эта проблема возникает, даже если я напрямую обращаюсь к своему узлу приложения (серверу tomcat) с помощью IP-адреса, поэтому я не думаю, что это связано с LB / сервером кэша / веб-сервером / любым параметром кластера.


person HybrisHelp    schedule 08.10.2018    source источник
comment
Для всех URL (корзина, оплата, билет и т. Д.) Или некоторых из них?   -  person mkysoft    schedule 08.10.2018
comment
Да для всех URL   -  person HybrisHelp    schedule 08.10.2018
comment
У вас есть кластерная система? Может быть запрос на вход перенаправлен на другой узел. Вы можете проверить идентификатор узла в заголовке.   -  person mkysoft    schedule 08.10.2018
comment
Да, но это происходит, даже если я напрямую обращаюсь к узлу приложения (tomcat)   -  person HybrisHelp    schedule 08.10.2018
comment
Похоже, у вас действительно есть проблемы с инфраструктурой. Что насчет LoadBalancer и «липких сессий», вы это проверяли? Может быть, вы могли бы дать нам краткую информацию о настройке вашей системы.   -  person Mafick    schedule 08.10.2018
comment
Да, изначально я так же думал, все возможное проверил. Как я уже сказал в комментарии выше. Проблема все еще существует, если я напрямую обращаюсь к tomcat (узел витрины). Поэтому я не думаю, что проблема связана с веб-сервером или LB.   -  person HybrisHelp    schedule 08.10.2018
comment
Если домен узла отличается от URL-адреса сайта, он попытается перенаправить его на домен LB. LB не имеет сеанса и может перенаправить его на любой другой. Также файлы cookie не отправляются из-за смены домена. Другой сценарий: вы проверяли использование памяти узла? Возможно, это может быть удаление некоторых данных сеанса из-за памяти.   -  person mkysoft    schedule 08.10.2018
comment
Спасибо mkysoft. Да, у меня и раньше были все эти сомнения. Но на самом деле так быть не должно. Потому что, если сеанс не был закреплен (перенаправление на другой узел), то пользователь не будет входить на сайт, но здесь он может войти на сайт. Просто он перенаправился на домашнюю страницу, а затем он может получить доступ к любым защищенным URL-адресам. Еще один момент: я могу восстановить эту проблему, даже если я напрямую обращаюсь к узлу приложения Hybris с использованием IP (LB не отображается). Позвольте мне проверить использование памяти.   -  person HybrisHelp    schedule 09.10.2018
comment
Вы пользуетесь Secureportaladdon? Если да, то какая разница между защищенными областями, такими как область моей учетной записи, и другими URL-адресами?   -  person andi    schedule 10.10.2018
comment
Спасибо всем за вашу помощь и время. @andi нет, это не связано с аддоном безопасного портала. Но да, я думаю, что у меня есть код виновного. Я опубликую подробности в ближайшее время.   -  person HybrisHelp    schedule 10.10.2018


Ответы (1)


Прошло много времени, поэтому я забыл точную причину проблемы. Думаю, мне удалось восстановить его на своем локальном компьютере и исправить, переопределив метод forceDefaultTargetUrlBySession в StorefrontAuthenticationSuccessHandler. Вот мой совершенный код.

protected void forceDefaultTargetUrlBySession(final HttpServletRequest request, final HttpServletResponse response)
{
    //if redirected from some specific url, need to remove the cachedRequest to force use defaultTargetUrl
    final RequestCache requestCache = new HttpSessionRequestCache();
    final SavedRequest savedRequest = requestCache.getRequest(request, response);

    if (savedRequest != null)
    {
        if (savedRequest.getRedirectUrl() != null && StringUtils.contains(savedRequest.getRedirectUrl(), PASSWORD_UPDATE_PAGE_PATH))
        {
            requestCache.removeRequest(request, response);
        }
    }
}
person HybrisHelp    schedule 07.03.2019