Сеанс Jetty http всегда равен нулю (встроенный контейнер, ServletHolder)

Я пытаюсь реализовать простой сервлет, который использует сеанс HTTP во встроенном контейнере причала (7.3.0 v20110203). Для запуска причала я использую следующий код:

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

Сервлет получает сеанс с

HttpSession session = request.getSession(true);

и хранит в нем некоторые данные. При следующем запросе он получает сеанс со следующим кодом:

HttpSession session = request.getSession(false);

и там сеанс всегда нулевой.

Я не нашел в Интернете никакой информации об этой конкретной проблеме. Я также экспериментировал с настройкой SessionManager или SessionIdManager, но это, похоже, ничего не меняло. Я подозреваю, что здесь что-то не хватает о SessionManager, SessionIdManager или SessionHandler, но это просто дикая догадка.


person David Tanzer    schedule 12.03.2011    source источник


Ответы (2)


Ваш код отлично работает с этой скелетной реализацией 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.

person Aldo    schedule 11.05.2011

Метод HttpServletResponse#reset() уничтожает вновь созданный сеанс, поэтому в следующий раз создается новый и так далее.

person SijeDeHaan    schedule 11.07.2012
comment
И с чего бы называть сброс? - person szymond; 29.08.2012