Как отправить некоторую информацию о звонящем / клиенте на серверную часть, используя Remote EJB на Wildfly? - PullRequest
0 голосов
/ 09 января 2019

Я работаю над приложением с большим количеством методов службы Remote EJB, и я хотел бы получить некоторую полезную информацию о клиенте, вызывающем методы (кроме очень базовой информации, такой как IP-адрес ...) .

Я нашел этот вопрос, но он немного устарел:

Как я могу идентифицировать клиента или абонента EJB в запросе?

Есть ли какая-то пользовательская контекстная / рабочая область клиента, в которую я мог бы поместить информацию о вызывающем абоненте и получить их на стороне сервера внутри локального потока?

В принципе, есть ли у меня другой вариант, кроме добавления параметра к каждому методу каждого сервиса?

1 Ответ

0 голосов
/ 21 января 2019

При включенной защите у вас есть возможность получить текущего пользователя. Это довольно просто, но, вероятно, не подойдет всем.

В общем, вы ничего не можете использовать "из коробки". Добавление некоторого пользовательского параметра, вероятно, является худшим вариантом.

JBoss и Wildfly предлагают возможность использования EJB-клиентских и серверных контейнерных перехватчиков. Детали использования и реализации зависят от версии вашего сервера приложений.

Я реализовал это, используя MDC (отображенный диагностический контекст) нашей инфраструктуры ведения журналов, чтобы улучшить ведение журналов на стороне сервера с помощью информации о вызывающем абоненте. Вы можете думать об этом, как с помощью ThreadLocal. Конечно, вам нужно что-то вроде контекста вызывающего на стороне клиента, содержащего конкретную информацию. Глобальные данные удаленного клиента (IP-адрес, ...) также могут быть установлены в клиентском перехватчике.

Грубый обзор того что я сделал:

  • Настройка ведения журнала на стороне клиента и сервера для использования дополнительных данных MDC
  • Расширение MDC на стороне клиента с данными ключа / значения
  • Перехватчик на стороне клиента извлекает данные из MDC и помещает их в контекст вызова
  • Перехватчик на стороне сервера извлекает данные из контекста вызова и улучшает MDC на стороне сервера.

Этот подход работает, но в зависимости от сложности вашего приложения (например, с помощью вызовов server2server, вызовов bean2bean для локальных асинхронных EJB-компонентов, ...) сложность возрастает. Не забудьте подумать о уборке, например. ваши данные ThreadLocal, чтобы избежать возможных утечек памяти.

...