Jetty http会话始终为null(Embedded Container,ServletHolder)

Dav*_*zer 9 servlets jetty embedded-jetty httpsession

我正在尝试实现一个简单的servlet,它在嵌入式jetty(7.3.0 v20110203)容器中使用HTTP会话.要启动jetty,我使用以下代码:

Server server = new Server(12043);
ServletContextHandler handler = new
            ServletContextHandler(ServletContextHandler.SESSIONS);
handler.setContextPath("/");
server.setHandler(handler);
ServletHolder holder = new ServletHolder(new BaseServlet());
handler.addServlet(holder, "/*");
server.start();
server.join();
Run Code Online (Sandbox Code Playgroud)

servlet获取会话

HttpSession session = request.getSession(true);
Run Code Online (Sandbox Code Playgroud)

并在其中存储一些数据.在下一个请求时,它会使用以下代码获取会话:

HttpSession session = request.getSession(false);
Run Code Online (Sandbox Code Playgroud)

会话始终为空.

我没有在互联网上找到有关此特定问题的任何信息.我还尝试过设置SessionManager或SessionIdManager,但这似乎没有改变任何东西.我怀疑我在这里遗漏了一些关于SessionManager或SessionIdManager或SessionHandler的内容,但这只是一个疯狂的猜测.

Ald*_*ldo 5

您的代码适用于BaseServlet的骨架实现:

public class BaseServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        boolean create = "true".equals(req.getParameter("create"));

        HttpSession session = req.getSession(create);
        if (create) {
            session.setAttribute("created", new Date());
        }

        PrintWriter pw = new PrintWriter(resp.getOutputStream());
        pw.println("Create = " + create);
        if (session == null) {
            pw.println("no session");
        } else {
            pw.println("Session = " + session.getId());
            pw.println("Created = " + session.getAttribute("created"));
        }

        pw.flush();
    }
Run Code Online (Sandbox Code Playgroud)

因此会话可能会在代码中的其他位置失效.

SessionHandler还可以使用本人员显式设定setSessionHandler()的方法ServletContextHandler.