嵌入式Jetty - IllegalStateException:没有SessionManager

时间:2012-03-25 17:13:31

标签: embedded-jetty

我在谷歌上发现了很多关于这个问题的引用,但没有答案。我正在使用最新版本的jetty(8.1.2.v20120308),我似乎无法使用嵌入式servlet来使用会话。当然,示例是在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()

在我的servlet代码中:

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

req.getSession抛出此异常,并且它之前的调试行始终为null。

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

在日志中我可以看到:

DEBUG org.eclipse.jetty.server.session - sessionManager=org.eclipse.jetty.server.session.HashSessionManager@2a8ceeea
DEBUG org.eclipse.jetty.server.session - session=null

我不确定这是否相关,但似乎会有一个会话管理器,但它在请求中不可用。

我已经使用WebAppContext尝试了相同的结果。更不用说以十几种不同的方式显式设置sessionManager。

3 个答案:

答案 0 :(得分: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这个词可能是关键所在。

答案 1 :(得分:0)

好吧,我觉得有点愚蠢,这个问题出现在我的servlet中,我在子线程中访问请求,当请求超出范围时访问了会话。在谷歌搜索错误,它发送我错误的路径,因为错误消息有点模糊。感谢BGR的回复。

答案 2 :(得分:0)

在jetty 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);           
}