我在谷歌上发现了很多关于这个问题的引用,但没有答案。我正在使用最新版本的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。
答案 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)
答案 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);
}