2012-03-25 7 views
10

Я нашел много ссылок на эту проблему в Google, но ответов нет. Я использую последнюю версию jetty (8.1.2.v20120308), и я не могу заставить встроенный сервлет использовать сеансы. Например, в scala, но это должно быть доступно для любого Java-программиста.Embedded Jetty - IllegalStateException: No SessionManager

val server = new Server(); 
val connector = new SelectChannelConnector() 
connector.setPort(Integer.getInteger("jetty.port", 8080).intValue()) 
server.setConnectors(Array(connector)) 

val webapp = new ServletContextHandler(ServletContextHandler.SESSIONS) 
webapp.setContextPath("/") 
webapp.setResourceBase(webDir) 
webapp.setServer(server) 

val brzyServ = new ServletHolder(new BrzyDynamicServlet()) 
webapp.addServlet(brzyServ, "*.brzy") 

server.setHandler(webapp); 
server.start() 

в моем коде сервлета:

... 
log.debug("session manager: {}",req.asInstanceOf[Request].getSessionManager) 
val session = req.getSession 
... 

req.getSession бросает это исключение, и отладки линии перед ним, всегда пустой.

java.lang.IllegalStateException: No SessionManager 
at org.eclipse.jetty.server.Request.getSession(Request.java:1173) 

В журнале я вижу это:

DEBUG org.eclipse.jetty.server.session - ses[email protected]2a8ceeea 
DEBUG org.eclipse.jetty.server.session - session=null 

Я не уверен, если это уместно, но казалось бы, что есть менеджер сессии, но он не доступен по запросу.

Я пробовал это с помощью WebAppContext с тем же результатом. Не говоря уже о явной настройке sessionManager по-разному.

ответ

11

Я считаю, что проблема исходит из того, что вы инстанцировании ServletContextHandler, а не WebappContext

Попробуйте

val webapp = new WebappContext(); 

или

val webapp = new ServletContextHandler(ServletContextHandler.SESSIONS) 
webapp.setSessionHandler(new SessionHandler()) 

От ServletContextHandler Javadoc

[...]construction of a context with ServletHandler and optionally session and security handlers [...] 

Слово optionally, скорее всего, является ключевым.

+0

Спасибо за ответ, но я пробовал оба эти варианты, не имели успеха. Я также попытался добавить HashSessionManager явно в SessionHandler, но независимо от того, что я пытаюсь, Jetty Request.getSession() всегда выбрасывает IllegalStateException. Вывод журнала из причала показывает, что существует диспетчер сеансов, он просто кажется доступным в запросе. –

+0

Майкл, глядя на код Jetty, единственный способ, которым я мог видеть это, заключается в том, что SessionHandler не связан и не инициализирован по запросу. У вас есть какая-то аутентификация в вашем web.xml? –

+0

У меня была такая же проблема, и для меня работал небольшой вариант ответа BGR, я просто добавил новый обработчик сеанса к обработчику контекста сервлета напрямую, не создавая WebAppContext, и он работал нормально. servletContextHandler.setSessionHandler (новый SessionHandler()) –

0

ОК, я чувствую себя немного глупо, эта проблема была в моем сервлете, я обращался к запросу в дочернем потоке, который обращался к сеансу, когда запрос был вне области видимости. И при ошибке Google, он отправил меня по неправильному пути, потому что сообщение об ошибке было немного неопределенным. Спасибо BGR за ответ.

0

В причалу 9.4, чтобы дать очень простой обработчик сеанса для servlethandler:

private static void setSessionEnableContext(Server server,ServletHandler handlerServlet) { 
     // Specify the Session ID Manager   
    SessionIdManager idmanager = new DefaultSessionIdManager(server); 
    server.setSessionIdManager(idmanager); 
    // Specify the session handler 
    SessionHandler sessionsHandler = new SessionHandler();  
    handlerServlet.setHandler(sessionsHandler);   
} 
Смежные вопросы