Встроенный Jetty: как мне вызвать setSessionTrackingModes без ServletContextListener

Я подключаю встроенный сервер Jetty к своему main и хочу использовать только файлы cookie в качестве режима отслеживания сеанса.

Итак, я пытаюсь сделать:

//in main
ServletContextHandler contextHandler = 
    new ServletContextHandler(ServletContextHandler.SESSIONS);

contextHandler
    .getServletContext()
    .setSessionTrackingModes(EnumSet.of(SessionTrackingMode.COOKIE));

Но я получаю следующее:

Exception in thread "main" java.lang.IllegalStateException
at org.eclipse.jetty.servlet.ServletContextHandler$Context.setSessionTrackingModes(ServletContextHandler.java:1394)

Мой контекст сервлета еще не инициализирован.

Очевидное решение — сделать это в ServletContextListener, но я бы не хотел. Я хочу, чтобы вся проводка и настройка оставались в одном центральном месте без использования прослушивателей.

Есть ли способ?


person elanh    schedule 25.06.2015    source источник
comment
Какая версия Джетти?   -  person Joakim Erdfelt    schedule 25.06.2015
comment
@JoakimErdfelt 9.3.0.M2 и выше   -  person elanh    schedule 25.06.2015


Ответы (1)


Причина исключения в том, что ServletContext еще не существует (ваш сервер еще не запущен).

Но есть 2 способа сделать это.

Техника 1) Явное управление сеансом:

    Server server = new Server(8080);

    // Specify the Session ID Manager
    HashSessionIdManager idmanager = new HashSessionIdManager();
    server.setSessionIdManager(idmanager);

    // Create the SessionHandler to handle the sessions
    HashSessionManager manager = new HashSessionManager();
    manager.setSessionTrackingModes(EnumSet.of(SessionTrackingMode.COOKIE)); // <-- here
    SessionHandler sessions = new SessionHandler(manager);

    // Create ServletContext
    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
    context.setSessionHandler(sessions); // <-- set session handling
    server.setHandler(context);

Это, вероятно, более подходящий способ сделать это для встроенного причала, так как теперь вы можете полностью контролировать создание/хранение/поведение сеансов.

Техника 2) Использовать значения по умолчанию, настроить HashSessionManager:

    Server server = new Server(8080);

    // Create ServletContext
    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
    context.getSessionHandler()
           .getSessionManager()
           .setSessionTrackingModes(EnumSet.of(SessionTrackingMode.COOKIE));
    server.setHandler(context);

Для простых веб-приложений это будет работать нормально.

person Joakim Erdfelt    schedule 25.06.2015
comment
Ясно, поэтому в основном устанавливайте режимы отслеживания через диспетчер сеансов напрямую, а не через контекст сервлета. Спасибо. - person elanh; 28.06.2015