Чому ВІЙНИ не можуть ділитися інформацією про сеанс?


11

Я бачив декількох розробників, які шукають рішення цієї проблеми: доступ до інформації про сеанси з іншої ВІЙНИ (навіть коли всередині одного і того ж EAR) - ось кілька прикладів: Будь-який спосіб поділити стан сеансу між різними програмами в tomcat? , Сеанс доступу до іншої веб-програми , різних файлів WAR, спільних ресурсів , Tomcat: Як ділитися даними між двома програмами? , Що робить атрибут crossContext у Tomcat? Чи це дозволяє обмін сеансом? і так далі...

З усього, що я шукав, є деякі конкретні рішення залежно від контейнера, але це якось " суперечить специфікації ". Я також переглянув специфікацію Java EE, не пощастивши знайти відповідь.

Деякі розробники говорять про з'єднання між веб-додатками, але я схильний не погоджуватися. З якої причини можна було б утримувати ВІЙНИ в одній і тій самій EAR, якщо б не з'єднання? Наприклад, до EJB можна отримати доступ локально (навіть якщо в іншому EAR є всередині іншого JAR JJB).

Більш конкретно, одна з моїх ВОЙН обробляє автентифікацію та авторизацію, і я хотів би поділитися цією інформацією з іншими ВІН (у тій самій ЗНО). Раніше мені вдалося подолати подібні проблеми, упакувавши WARs як JARs та ввівши їх у єдиний проект ВІЙНИ (WEB-INF / lib). Але мені це рішення не подобається (воно вимагає величезних зусиль щодо іменування сервлетів тощо).

І жодне рішення не дало відповіді на перше (і найважливіше) питання: Чому ВОЙНИ не можуть ділитися інформацією про сеанси?


1
Не впевнений, чому це було знято, окрім того, що це може бути краще для ЗП.
NateDSaint

3
"Відповідно до специфікації API сервлета 2.3, менеджер сеансів підтримує обробку сеансу лише через веб-модуль. Тільки сервлети в одному веб-модулі можуть отримати доступ до даних, пов'язаних з певним сеансом." Це можна побачити ще раз у HttpSession - "Інформація про сеанс поширюється лише на поточну веб-програму (ServletContext), тому інформація, що зберігається в одному контексті, не буде безпосередньо видимою в іншому." - Це суперечить специфікації.

(краще, поточне посилання для HttpSession )

@MichaelT, дякую Але це все ще не відповідає чому.
rvcoutinho

@NateDSaint Хоча питання стосується конкретних технологій, я вважав, що це скоріше концептуальне питання. Потім я зважився на програмістів.
rvcoutinho

Відповіді:


7

Поводьтеся з EAR як з псевдо-віртуальною машиною

EAR - це просто набір файлів WAR, які мають спільну конфігурацію та бібліотеки, як правило, з JAR. Це дає змогу легше керувати колекцією взаємозалежних служб у контейнері додатків. Таким чином, ви можете розглядати EAR як просту форму віртуальної машини, як тільки вона буде розгорнута у свій контейнер.

Так само, як один процес на віртуальній машині не може впливати на інший, те саме стосується і EAR. Усі ВОЙНИ ізольовані для захисту свого внутрішнього стану.

Аутентифікація масштабування

В цілому веб-додатки повинні бути без стану, щоб добре масштабувати. Наявність великої кількості інформації в сеансі - це антидіаграма, яка перешкоджає цьому. Це призводить до конфлікту між бездротовим характером HTTP та необхідністю підтримувати швидкий, налаштований користувачем досвід. Автентифікація - це класичний випадок використання і є поширеним у балаканистих API, що потребують безлічі аутентифікованих запитів для забезпечення функціональності кінцевого користувача.

Одноразове ввімкнення та одновікове вимкнення потребують ретельної сигналізації для правильної роботи (врахуйте часткове вивільнення), особливо коли горизонтальне масштабування встановлено. Просто обмін станом сеансу майже ніколи не є хорошим рішенням, а кращим підходом є використання єдиної точки відліку для інформації користувача, до якої мають доступ усі вузли кластеру.

Концентрування на швидкому кешованому доступі до відповідної інформації дасть набагато більш масштабовані результати, ніж якесь складне, крихке рішення спільного використання сеансів.


Дякую, @GaryRowe. Це відповідь, яку я шукав. Так чи інакше, не могло це вирішити розробник?
rvcoutinho

Ще одне питання: Чи вважаєте ви, що кеш JBoss може бути хорошим рішенням? Ви чули про Apache Shiro (та його кластерну сесію)? Що з цим?
rvcoutinho

@rvcoutinho Чи розробник програми вирішує, як керуються процесами в ядрі Linux? Це подібне постановка питання - так, ви могли б це зробити, але це буде вкрай важко і, ймовірно, заподіє вам більше болю, ніж йти альтернативним шляхом.
Гері Роу

2
@rvcoutinho Я не використовував Apache Shiro (він же Apache Security), але я думаю, що це було б гарним рішенням спільної проблеми безпеки. Однозначно розглядайте можливість інтеграції з OpenID та OAuth2, а не згортання власного протоколу для досягнення того ж самого. Кеш JBoss, за власним визнанням, в глухий кут замінюється Infinispan, що виглядає досить складно. Можливо, ви захочете подивитися на веб -сайті програми « Дванадцять факторів», щоб ознайомитись з більш простим масштабованим рішенням.
Гері Роу

2

Мені здається, це не вистачає функціональності в специфікації JEE EAR - можливість обміну веб-сесіями в декількох веб-архівах, пов'язаних в EAR.

Сервери додатків, такі як Weblogic, не мають std-реалізацій для цієї функції.


Такою була моя думка. Я намагався зрозуміти, чому був зроблений згаданий вибір.
rvcoutinho

1

Ну, AFAIKS, немає реальної причини, чому ви хотіли б це зробити. ВІЙНА - це самостійна веб-програма, яка має власні (специфічні для веб-додатків) сфери застосування (наприклад, область сеансу). Якщо вам потрібно поділитися функціональністю (код Java, сторінки JSP, файли CSS), між кількома ВІН ви маєте набагато розумніший варіант упаковки їх у вигляді файлів JAR та розміщення їх на сервері додатків. Пакет WAR - це більш складне рішення для упаковки, яке призначене для інкапсуляції чогось іншого, ніж простий "загальний код / ​​функціональність". JAR - більш простий формат І призначений для упаковки та спільного використання коду та функціональності. Чому ви хочете використовувати більш складну та не конкретно розроблену для цього упаковку, щоб поділитися чимось, коли у вас вже є простіший і більш підходящий для цього формат пакету.


Я погоджуюсь з тобою. Але лише якщо мова йде лише про загальні ресурси. Але для однієї програми для входу мені потрібно поділитися конкретною інформацією про сеанс (про користувача, що зареєструвався). І я не бачу причин, чому це було б проти спец.
rvcoutinho

2
Оскільки область сеансу не створена для обміну поточними даними користувачів між різними програмами. І тому, що SSO передбачає більше, ніж перевірку атрибутів області сеансу. Ви можете робити і пакувати код за межами своєї війни (і який би не залежав від вашої війни, а скоріше, щоб війна залежала від неї), що дозволило б отримати доступ до атрибутів сеансу, якщо хочете (як фільтр), але кращим рішенням IMHO було б мати окрему фасадну програму або конфігурацію сервера, яка займається автентичністю, і надає доступ до інших (військово-розгорнутих) програм.
Дракон Шиван

Я б знову погодився з вами. Тим не менш, специфікація JavaEE (використовуючи JAAS) містить інформацію про користувача як частину HttpSession, яка протистоїть цьому підходу. Однією з причин я вважав замість цього використовувати Широ (він підтримує ортогональний сеанс).
rvcoutinho

У будь-якому випадку, дякую за відповідь. У мене ще немає остаточної відповіді на моє запитання, але все, що ви сказали, є актуальним. +1
rvcoutinho

@rvcoutinho добре, це моя думка з цього приводу, вибачте, що вона вам не була кориснішою.
Дракон Шиван

0

Я думаю, що це було зроблено спеціально, щоб уникнути випадкових перезаписів інформації про сеанси, коли різні веб-програми. У вашому випадку це може стати в нагоді, але в цілому ви не хочете, щоб користувачі збивали додаток або збільшували свої привілеї лише тому, що вони використовують два веб-додатки одночасно. Ділитися інформацією між веб-додатками не зовсім важко; просто складіть клас зі статичним HashMap, використовуйте GUID як ключі та передайте їх як частину параметра URL або HTTP.


Дякую. Насправді я говорив не про обмін цілим сеансом між кожною програмою, а конкретну інформацію про сеанс (як інформацію про користувача), коли це було потрібно. Можливо, мені було не ясно. Будь-які пропозиції щодо того, щоб зробити це зрозумілішим?
rvcoutinho
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.