Я видел нескольких разработчиков, которые искали решение для этой проблемы: доступ к информации о сеансе из другой WAR (даже если внутри одного EAR) - вот несколько примеров: Есть ли способ поделиться состоянием сеанса между различными приложениями в tomcat? , Сеанс доступа другого веб-приложения , другие файлы WAR, общие ресурсы , Tomcat: как обмениваться данными между двумя приложениями? , Что делает атрибут crossContext сделать в Tomcat? Включает ли это совместное использование сеанса? и так далее...
Из всего, что я искал, есть некоторые конкретные решения в зависимости от контейнера, но это как-то « противоречит спецификации ». Я также просмотрел спецификацию Java EE, но без удачи нашел ответ.
Некоторые разработчики говорят о связи между веб-приложениями, но я склонен не соглашаться. По какой причине можно хранить WAR внутри одного EAR, если не используется соединение? К EJB, например, можно получить доступ локально (даже если внутри другого EJB JAR в том же EAR).
В частности, одна из моих WAR-ов обрабатывает аутентификацию и авторизацию, и я хотел бы поделиться этой информацией с другими WAR-ами (в том же EAR). Я уже успел обойти подобные проблемы, упаковав WAR-файлы в JAR-файлы и поместив их в отдельный WAR-проект (WEB-INF / lib). Но мне не нравится это решение (оно требует огромных усилий для именования сервлетов и так далее).
И ни одно решение не ответило на первый (и самый важный) вопрос: почему WAR не могут делиться информацией о сеансах?
источник
Ответы:
Относитесь к EAR как к псевдовиртуальной машине
EAR - это просто набор файлов WAR, которые имеют общую конфигурацию и библиотеки, обычно из JAR. Это позволяет легче управлять набором взаимозависимых сервисов в контейнере приложения. Таким образом, вы можете думать о EAR как о простой форме виртуальной машины после ее развертывания в своем контейнере.
Точно так же, как один процесс на виртуальной машине не может влиять на другой, так же верно и для EAR. Все WAR изолированы для защиты их внутреннего состояния.
Масштабная аутентификация
В общем, веб-приложения должны быть без состояний, чтобы хорошо масштабироваться. Наличие большого количества информации в сеансе является антишаблоном, который предотвращает это. Это приводит к конфликту между природой HTTP без сохранения состояния и необходимостью поддерживать быстрое, настраиваемое взаимодействие с пользователем. Аутентификация является классическим вариантом использования и распространена в болтливых API, которым требуется множество аутентифицированных запросов для предоставления функциональности конечному пользователю.
Единый вход и единый выход требуют тщательной сигнализации для правильной работы (рассмотрите возможность частичного выхода из системы), особенно при горизонтальном масштабировании. Простое совместное использование состояния сеанса почти никогда не является хорошим решением, и лучшим подходом является использование единой точки отсчета для пользовательской информации, к которой имеют доступ все узлы в кластере.
Концентрация на быстром кэшированном доступе к соответствующей информации даст гораздо более масштабируемые результаты, чем какое-либо сложное, хрупкое решение для совместного использования сеансов.
источник
Мне кажется, что в спецификации JEE EAR отсутствует функциональность - возможность совместного использования веб-сеансов между несколькими веб-архивами, связанными в EAR.
Серверы приложений, такие как Weblogic, имеют не стандартные реализации для этой функции.
источник
Ну, AFAIKS, нет никакой реальной причины, почему вы хотели бы сделать это. WAR - это автономное веб-приложение с собственными (специфичными для веб-приложения) областями действия (например, областью действия сеанса). Если вам нужно разделить функциональность (код Java, страницы JSP, файлы CSS), между несколькими WAR-файлами у вас есть гораздо более разумный вариант упаковки их в виде файлов JAR и их развертывания на сервере приложений. Пакет WAR - это более сложное упаковочное решение, разработанное для инкапсуляции чего-то отличного от простого «общего кода / функциональности». JAR - это более простой формат AND, разработанный для упаковки и совместного использования кода и функций. Почему вы хотите использовать более сложную и не специально предназначенную для этой упаковки упаковку, чтобы поделиться чем-то, когда у вас уже есть более простой и более подходящий для этого формат пакета.
источник
Я думаю, что это было сделано специально, чтобы различные веб-приложения случайно не перезаписывали информацию о сеансах друг друга. Это может пригодиться в вашем случае, но в целом вы не хотите, чтобы пользователи вызывали сбой приложения или повышали его привилегии только потому, что они используют два веб-приложения одновременно. Нетрудно обмениваться информацией между веб-приложениями; просто создайте класс со статическим HashMap, используйте GUID в качестве ключей и передавайте их как часть параметра URL или HTTP.
источник