2012-03-25 27 views
10

He encontrado muchas referencias a este problema en google, pero no hay respuestas. Estoy usando la última versión de jetty (8.1.2.v20120308) y parece que no puedo obtener un servlet incrustado para poder utilizar las sesiones. El ejemplo está en scala, por supuesto, pero debería ser legible para cualquier programador de Java.Jetty incrustado - IllegalStateException: No SessionManager

val server = new Server(); 
val connector = new SelectChannelConnector() 
connector.setPort(Integer.getInteger("jetty.port", 8080).intValue()) 
server.setConnectors(Array(connector)) 

val webapp = new ServletContextHandler(ServletContextHandler.SESSIONS) 
webapp.setContextPath("/") 
webapp.setResourceBase(webDir) 
webapp.setServer(server) 

val brzyServ = new ServletHolder(new BrzyDynamicServlet()) 
webapp.addServlet(brzyServ, "*.brzy") 

server.setHandler(webapp); 
server.start() 

en mi código servlet:

... 
log.debug("session manager: {}",req.asInstanceOf[Request].getSessionManager) 
val session = req.getSession 
... 

El req.getSession lanza esta excepción, y la línea de depuración antes de que, siempre es nula.

java.lang.IllegalStateException: No SessionManager 
at org.eclipse.jetty.server.Request.getSession(Request.java:1173) 

En el registro que se puede ver esto:

DEBUG org.eclipse.jetty.server.session - ses[email protected]2a8ceeea 
DEBUG org.eclipse.jetty.server.session - session=null 

No estoy seguro de si eso es relevante, pero parece que hay un gestor de sesiones, pero que no está disponible a petición.

He intentado esto con el WebAppContext con el mismo resultado. Sin mencionar explícitamente la configuración del sessionManager de una docena de maneras diferentes.

Respuesta

11

Creo que el problema viene del hecho de que está instancias de un ServletContextHandler en lugar de un WebappContext

Trate

val webapp = new WebappContext(); 

o

val webapp = new ServletContextHandler(ServletContextHandler.SESSIONS) 
webapp.setSessionHandler(new SessionHandler()) 

Desde el javadoc ServletContextHandler

[...]construction of a context with ServletHandler and optionally session and security handlers [...] 

La palabra optionally es probablemente la clave aquí.

+0

Gracias por la respuesta, pero yo he probado ambas variantes, sin éxito. También intenté agregar HashSessionManager explícitamente a SessionHandler, pero no importa lo que intente, el embarcadero Request.getSession() siempre arroja IllegalStateException. La salida de registro de embarcadero muestra que existe un administrador de sesión, simplemente parece que está disponible en la solicitud. –

+0

Michael, mirando el código de Jetty, la única forma en que pude ver que esto sucedía es que ningún SessionHandler está asociado e inicializado en la solicitud. ¿Tiene algún tipo de autenticación en su web.xml? –

+0

Estaba teniendo el mismo problema, y ​​una pequeña variante de la respuesta de BGR me funcionó, simplemente agregué un nuevo manejador de sesión a mi manejador de contexto de servlet directamente sin crear un WebAppContext y funcionó bien. servletContextHandler.setSessionHandler (new SessionHandler()) –

0

bien, me siento un poco tonto, este problema estaba en mi servlet, estaba accediendo a la solicitud en un hilo secundario, que accedió a la sesión cuando la solicitud estaba fuera del alcance. Y al buscar en Google el error, me envió por el camino equivocado porque el mensaje de error era un poco vago. Gracias a BGR por la respuesta.

0

En embarcadero 9.4, para permitir un sencillo gestor de sesiones para un servlethandler:

private static void setSessionEnableContext(Server server,ServletHandler handlerServlet) { 
     // Specify the Session ID Manager   
    SessionIdManager idmanager = new DefaultSessionIdManager(server); 
    server.setSessionIdManager(idmanager); 
    // Specify the session handler 
    SessionHandler sessionsHandler = new SessionHandler();  
    handlerServlet.setHandler(sessionsHandler);   
} 
Cuestiones relacionadas