servidor - Obtenga el objeto HttpServletRequest(request) del código Java
subir archivos a servidor jsp (5)
Necesito conseguir el objeto de solicitud en el código de Java. No puedo pasar este objeto a mi código por ciertas razones. ¿Hay alguna manera en que pueda decir algo como: getCurrentHTTPServletRequest
?
Es seguro para mí suponer que estoy en un contexto de servlet.
Bueno, debes pasarlo si lo necesitas. Cualquier otra cosa que hagas será fea, básicamente.
Podría usar una variable ThreadLocal
: básicamente, establezca el contexto para ese hilo en particular cuando obtenga la solicitud, y luego tráigala más tarde. Eso funcionará siempre que solo necesite obtener la solicitud dentro del hilo que la está procesando, y siempre que no realice ningún manejo asincrónico de solicitudes funky. Sin embargo, es frágil, precisamente por esas razones.
Sin embargo, le recomendaría encarecidamente que sea explícito sobre sus dependencias en su lugar. Pase la solicitud de servlet, o solo los bits que necesita.
Jon Skeet dijo prácticamente todo, pero una aclaración a su consejo "solo los bits que necesitas": si necesitas que tus parámetros de solicitud se transmitan, pero no necesitas una dependencia en HttpServletRequest
, pasa request.getParameterMap()
.
Y ampliando un poco la opción ThreadLocal
: puede tener un Filter
que maneje todas las solicitudes entrantes y establezca la solicitud en un
public final static ThreadLocal<HttpServletRequest> httpServletRequestTL =
new ThreadLocal<HttpServletRequest>();
Como lo está configurando en cada solicitud (teniendo cuidado con la asignación de filtros), no tendrá que preocuparse por el conjunto de subprocesos de servlet-contenedor: siempre tendrá la solicitud actual .
PS: esta es la lógica detrás de la utilidad de primavera propuesta por skaffman. Me uno a él para recomendar el componente estable, en lugar de hacer uno propio.
Suponiendo que el servlet de nivel superior realmente es tabú por algún motivo loco relacionado con el negocio, todavía existe la opción de definir un ServletFilter
para ver previamente la solicitud y rellenarla en un ThreadLocal. Asumiendo que el web.xml
no es también sacrosanto.
Pero estoy de acuerdo con Jon Skeet en que esto sería muy feo. Codificaría esto y luego trataría de encontrar un trabajo diferente. :)
En realidad, dado el hecho de que un filtro puede arrebatar totalmente el control del servlet de recepción, puede utilizar esta técnica para desviar el código a un servlet propio, hacer lo que quiera y, a continuación, ejecutar el otro servlet "oficial". .. o cualquier otra cosa a lo largo de esas líneas. Algunas de esas soluciones incluso le permitirán tratar de manera correcta y sólida con sus datos de solicitud.
Suponiendo que no puede pasar el objeto de solicitud por la pila de llamadas, se hace necesario algún tipo de mecanismo de compartición, lo que no es ideal, pero a veces es necesario.
Spring proporciona RequestContextFilter solo para este propósito. Utiliza ThreadLocal
y permite que el código ThreadLocal
la solicitud actual a través de RequestContextHolder . Tenga en cuenta que este filtro no requiere el uso de ninguna otra parte de Spring:
Servlet 2.3 Filtro que expone la solicitud al hilo actual, a través de LocaleContextHolder y RequestContextHolder. Para registrarse como filtro en web.xml.
Este filtro se utiliza principalmente con servlets de terceros, por ejemplo, JSF FacesServlet. Dentro del propio soporte web de Spring, el procesamiento de DispatcherServlet es perfectamente suficiente.
Si va a utilizar ThreadLocal
, entonces es mejor usar una solución existente que funcione, en lugar de correr riesgos, a la cual el código ThreadLocal
es propenso.
No hay una API de servlet para hacer esto. Sin embargo, Tomcat proporciona una llamada API para hacer esto,
HttpServletRequest request = (HttpServletRequest)org.apache.catalina.core.ApplicationFilterChain.getLastServicedRequest();
Esto hará que se pase la última solicitud a un servlet para su reparación desde el hilo actual.
Para que esto funcione, el Tomcat debe estar en modo "Estricto cumplimiento del servlet". De lo contrario, debe habilitarlo agregando este parámetro de JVM:
org.apache.catalina.STRICT_SERVLET_COMPLIANCE=true