JAXWS и сессии - PullRequest
       32

JAXWS и сессии

2 голосов
/ 02 мая 2010

Я довольно новичок в написании веб-сервисов. Я работаю над сервисом SOAP с использованием JAXWS. Я хотел бы, чтобы пользователи могли входить в систему и в моем сервисе знать, какой пользователь выполняет команду. Другими словами, есть некоторая обработка сеанса.

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

Есть ли лучший подход, позволяющий сервисному уровню не знать о транспортном уровне? Есть ли способ, которым я могу сделать это с помощью фильтров сервлетов? Я бы хотел, чтобы ответ был как можно более независимым от фреймворка.

Ответы [ 2 ]

5 голосов
/ 02 мая 2010

Я работаю над сервисом SOAP с использованием JAXWS. Я хотел бы, чтобы пользователи могли входить в систему и в моем сервисе знать, какой пользователь выполняет команду. Другими словами, есть некоторая обработка сеанса.

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

Если вы хотите, чтобы ваши пользователи проходили аутентификацию для вызова службы, традиционный подход заключается в следующем:

  1. Предоставление веб-службы «аутентификации» (передача учетных данных пользователя), которая возвращает токен аутентификации.
  2. Пусть пользователи сначала вызовут эту аутентификацию.
  3. Попросите пользователей передавать токен в пользовательском заголовке при последующих вызовах «бизнес» веб-сервисов.

На стороне сервера:

  1. Отклонить любой вызов, который не содержит действительный токен.
  2. Недействительные токены через некоторое время бездействия

Вы можете реализовать индивидуальное решение для этого подхода (это решение с высокой степенью взаимодействия). Или вы можете использовать WS-Security / UsernameTokens , который предоставляет нечто подобное из коробки. WS-Security - это стандарт (его реализует Metro), он не зависит от фреймворка.

1 голос
/ 02 мая 2010

Как вы упоминаете, фильтры сервлетов могут служить основой решения. Используйте фильтр для сохранения текущих сведений о сеансе (например, карты контекста сеанса) в локальном хранилище потока. Это реализовано как класс вашего приложения, так и транспортная независимость. Ваша служба просто использует статический метод для извлечения текущего контекста, не зная, откуда он.

* 1003 Е.Г. *

class ServiceSessionContext
{
    static ThreadLocal<Map> local = new ThreadLocal<Map>();

    // context set by the transport layer, e.g. servlet filter
    static public void setContext(Map map)
    {
        local.put(map);
    }

    // called when request is complete
    static public void clearContext()
    {
        local.put(null);
    }

    // context fetched by the service
    static public Map getContext()
    {
        return local.get();
    }
}    
...