2011-02-14 12 views
5

Necesito escribir una clase Servlet o Filter que pueda obtener acceso al objeto org.apache.catalina.connector.Request, que está envuelto en el objeto RequestFacade dado a mi servlet. La conversión no funciona, ya que RequestFacade no es una subclase de solicitud.¿Cómo obtengo el objeto org.apache.catalina.connector.Request en Tomcat?

La razón por la que necesito esto es porque estoy tratando de llamar al método setRequestedSessionId() de Request, y aparentemente esto no forma parte de la especificación del servlet de Http. La razón por la que necesito hacer esto es porque el ID de la sesión se está incluyendo en una URL con un nombre diferente al de JSESSIONID. No puedo cambiar la URL o el nombre del parámetro, por lo que intento asociar la solicitud con la sesión correcta extrayendo la ID de sesión y llamando a Request.setRequestedSessionId().

Realmente he resuelto el problema usando una subclase Valve, pero no me gusta usar una válvula porque, por lo que puedo ver, necesito instalar mi subclase Valve en el directorio Tomcat/server/classes en lugar de empaquetar con el resto de mi aplicación web. Si hubiera una forma portátil de hacerlo a través de diferentes contenedores Servlet, sería genial, pero por el momento me resigno a hacer este Tomcat específico.

Este es el código de la válvula de trabajo:

public class SessionSetter extends ValveBase { 
public void invoke(Request request, Response response) throws IOException, ServletException { 
    String sessionId = request.getParameter("whatever"); 
    request.setRequestedSessionId(sessionId); 
} 

}

¿Hay alguna manera de hacer lo mismo en un servlet o filtro? ¿O hay alguna forma de empaquetar la clase Valve en mi archivo .war de la aplicación?

+0

¿Por qué necesita que ? – Bozho

+1

¿Por qué tengo que hacer qué? Pensé que había indicado los motivos en el segundo párrafo, por favor díganme qué parte no explicaba bien. –

+1

Si está utilizando Tomcat 6, esta podría ser una alternativa que podría consultar: http://tomcat.apache.org/tomcat-6.0-doc/config/systemprops.html#Sessions. Puede cambiar los nombres utilizados para el parámetro id de sesión utilizando las propiedades del sistema. Sin embargo, no está disponible para Tomcat 7 por lo que puedo decir (creo que la especificación de servlet que tc7 implementa es más estricta para cambiar el nombre). – matt

Respuesta

5

(esto es mi comentario pasaron a una respuesta)

Si está utilizando Tomcat 5.5 o 6, entonces esto podría ser una alternativa usted podría mirar a: http://tomcat.apache.org/tomcat-6.0-doc/config/systemprops.html#Sessions. Puede cambiar los nombres utilizados para el parámetro id de sesión utilizando las propiedades del sistema. Sin embargo, no está disponible para Tomcat 7 por lo que puedo decir (creo que la especificación de servlet que tc7 implementa es más estricta para cambiar el nombre).

En cuanto al acceso al objeto de solicitud interna de Tomcat desde su aplicación web (servlet o filtro), no creo que pueda hacerlo. Me parece recordar haber leído en alguna parte que la clase RequestFacade existe explícitamente para evitar eso, de modo que una aplicación web no puede meterse con las partes internas de Tomcat.

3

tiendas Tomcat el verdadero Solicitud objeto en la protegida variable de petición de RequestFacade, para que pueda conseguirlo (en un servlet o JSP) con reflection:

import java.lang.reflect.Field; 
import org.apache.catalina.connector.Request; 

... 

Field f = request.getClass().getDeclaredField("request"); 
f.setAccessible(true); // grant access to (protected) field 
Request realRequest = (Request)f.get(request); 
+0

Tenga en cuenta que esto no funcionará si un administrador de seguridad de Java está en su lugar para restringir setAccessible. –

Cuestiones relacionadas