9

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

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();

servlet 获得一个会话

HttpSession session = request.getSession(true);

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

HttpSession session = request.getSession(false);

并且会话始终为空。

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

4

3 回答 3

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();
    }

所以会话可能在您的代码中的其他地方失效。

SessionHandler也可以使用 的方法显式setSessionHandler()设置ServletContextHandler

于 2011-05-11T08:49:13.047 回答
0
//You need to setup SessionManager first. This worked for me.
Server server = new Server(8031);
ServletHandler handler = new ServletHandler();
server.setHandler(handler);

HashSessionIdManager hashSessionIdManager = new 
HashSessionIdManager();
SessionHandler sessionHandler = new SessionHandler();
SessionManager sessionManager = new HashSessionManager();
sessionManager.setSessionIdManager(hashSessionIdManager);
sessionHandler.setSessionManager(sessionManager);
sessionHandler.setHandler(handler);
sessionHandler.setServer(server);
server.setSessionIdManager(hashSessionIdManager);
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
context.addServlet("webservlet.IndexServlet", "/index");
context.addServlet("webservlet.HomeServlet", "/home");
context.addServlet("webservlet.CategoryServlet", "/category");
context.addServlet("webservlet.ProductServlet", "/product");
...
于 2013-12-05T10:41:44.550 回答
-1

该方法HttpServletResponse#reset()销毁一个新创建的会话,因此下次创建一个新会话,依此类推。

于 2012-07-11T08:49:41.987 回答