2011-03-12 13 views
9

Estoy tratando de implementar un servlet simple que utiliza una sesión HTTP en un contenedor incrustado (7.3.0 v20110203). Para iniciar embarcadero utilizo el siguiente código:Jetty sesión http siempre es nula (Embedded Container, ServletHolder)

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 ella. A la siguiente solicitud se hace la sesión con el siguiente código:

HttpSession session = request.getSession(false); 

y no la sesión es siempre nula.

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

Respuesta

5

Su código funciona bien con esta implementación esquelé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 invalida en otro lugar en el código.

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

-1

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.

+0

¿Y por qué se debería llamar al reinicio? – szymond

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