servlets jetty embedded-jetty httpsession

servlets - jetty embedded



Jetty http session siempre es nula(Embedded Container, ServletHolder) (3)

El método HttpServletResponse#reset() destruye una sesión recién creada, por lo que se crea una nueva la próxima vez y así sucesivamente.

Estoy tratando de implementar un servlet simple que utiliza una sesión HTTP en un contenedor embarcación integrada (7.3.0 v20110203). Para comenzar embarcadero, uso el siguiente código:

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

El servlet adquiere una sesión con

HttpSession session = request.getSession(true);

y almacena algunos datos en él. En la próxima solicitud, obtiene la sesión con el siguiente código:

HttpSession session = request.getSession(false);

y allí la sesión siempre es nula.

No encontré ninguna información en Internet sobre este problema en particular. También he experimentado con la configuración de un SessionManager o SessionIdManager, pero eso no pareció cambiar nada. Sospecho que me falta algo sobre SessionManager o SessionIdManager o SessionHandler aquí, pero esto es solo una suposición descabellada.


Su código funciona bien con esta implementación esquemática de 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(); }

por lo que la sesión probablemente se invalide en otro lugar en su código.

SessionHandler también se puede configurar explícitamente utilizando el método setSessionHandler() de ServletContextHandler .


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"); ...