2011-08-20 12 views
5

Tendré que implementar mi propia versión de HttpSession en Java. He encontrado muy poca información que explique cómo lograr tal hazaña.cómo implementar una sesión http personalizada en java?

Supongo que mi problema es: ¿cómo puedo anular la HttpSession existente sin importar la implementación del servidor de la aplicación?

Lo hice correr a través de una lectura de calidad, pero bastante antiguo que ayuda a alcanzar mi meta - http://java.sun.com/developer/technicalArticles/Servlets/ServletControl/

¿Hay otros enfoques?

+6

AFAIK, esto no es posible. La especificación JEE no exige que la implementación de HttpSession sea reemplazable. Pero la pregunta principal es: ¿por qué quieres hacer esto? –

+0

no estoy seguro de si necesita saber cómo implementarlo, pero consulte este http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/Servlet-Tutorial-Session-Tracking.html – eon

+0

¿Qué es exactamente lo que necesita hacer y cree que necesita implementar HttpSession? – CrackerJack9

Respuesta

4

crear una nueva clase, e implementar HttpSession:

public class MyHttpSession implements javax.servlet.http.HttpSession { 

    // and implement all the methods 

} 

de responsabilidad: No he probado esto mismo:

luego escribir un filtro con una url-pattern de/* y se extienden HttpServletRequestWrapper. Su contenedor debe devolver su clase personalizada HttpSession en getSession(boolean). En el filtro, use su propio HttpServletRequestWrapper.

+0

Sí, lo sé, pero ¿cómo se obtiene el servidor de aplicaciones (es decir, Glassfish, WebLogic) para devolver MyHttpSession cuando se llama a request.getSession()? – plymouth5

+0

¿Qué servidor de aplicaciones estás usando? – CrackerJack9

+0

Actualmente uso Glassfish 3 – plymouth5

1

No parece que sea fácilmente factible de una manera portátil que funcionaría entre diferentes contenedores, ya que la implementación de HttpSession es proporcionada por el contenedor J2EE.

Sin embargo, para lograr un resultado similar, se puede implementar un javax.servlet.Filter y javax.servlet.HttpSessionListener y en el filtro, envuelva el ServletRequest y ServletResponse, tal como se describe en Spring Boot with Hazelcast and Tomcat.

4

Sus dos formas.

"Envoltura" del original HttpSession en su propia implementación HttpServletRequestWrapper.

Hice esto hace poco tiempo para la agrupación de sesiones distribuidas con Hazelcast y Spring Session.

Here se explica bastante bien.

En primer lugar, poner en práctica su propio HttpServletRequestWrapper

public class SessionRepositoryRequestWrapper extends HttpServletRequestWrapper { 

     public SessionRepositoryRequestWrapper(HttpServletRequest original) { 
       super(original); 
     } 

     public HttpSession getSession() { 
       return getSession(true); 
     } 

     public HttpSession getSession(boolean createNew) { 
       // create an HttpSession implementation from Spring Session 
     } 

     // ... other methods delegate to the original HttpServletRequest ... 
} 

Después, a partir de su propio filtro, envuelve el original HttpSession, y ponerlo dentro de la FilterChain recibida por su contenedor servlet.

public class SessionRepositoryFilter implements Filter { 

     public doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
       HttpServletRequest httpRequest = (HttpServletRequest) request; 
       SessionRepositoryRequestWrapper customRequest = 
         new SessionRepositoryRequestWrapper(httpRequest); 

       chain.doFilter(customRequest, response, chain); 
     } 

     // ... 
} 

Por último, establecer su filtro al principio en el web.xml para asegurar que funcione antes que cualquier otro.

La segunda manera de lograrlo es proporcionando a su Servlet Container su SessionManager personalizado.

Por ejemplo, en Tomcat 7.

Cuestiones relacionadas