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