Embedded Jetty - IllegalStateException: нет SessionManager
Я нашел много ссылок на эту проблему в Google, но ответов нет. Я использую последнюю версию jetty (8.1.2.v20120308), и я не могу заставить встроенный сервлет использовать сеансы. Например, пример находится в scala, но он должен быть доступен для чтения любому java-программисту.
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 по-разному.
Ответы
Ответ 1
Я считаю, что проблема связана с тем, что вы создаете экземпляр ServletContextHandler
, а не WebappContext
Try
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
, скорее всего, является ключевым.
Ответ 2
ok, я чувствую себя немного глупо, эта проблема была в моем сервлете, я обращался к запросу в дочернем потоке, который обращался к сеансу, когда запрос был вне области видимости. И при ошибке Google, он отправил меня по неправильному пути, потому что сообщение об ошибке было немного неопределенным. Спасибо BGR за ответ.
Ответ 3
В причале 9.4, чтобы включить очень простой обработчик сеанса для сервлета:
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);
}