Estoy haciendo un controlador frontal simple y muy ligero. Necesito hacer coincidir las rutas de solicitud con diferentes controladores (acciones) para elegir la correcta.
En mi máquina local HttpServletRequest.getPathInfo()
y HttpServletRequest.getRequestURI()
devolver los mismos resultados. Pero no estoy seguro de qué devolverán en el entorno de producción.
Entonces, ¿cuál es la diferencia entre estos métodos y qué debo elegir?
Respuestas:
getPathInfo()
proporciona la información de ruta adicional después del URI, que se utiliza para acceder a su Servlet, mientras quegetRequestURI()
proporciona el URI completo.Pensé que serían diferentes, dado que un Servlet debe configurarse con su propio patrón de URI en primer lugar; Creo que nunca he servido un Servlet desde la raíz (/).
Por ejemplo, si el Servlet 'Foo' está asignado a URI '/ foo', entonces habría pensado que el URI:
Daría como resultado:
y
fuente
getRequestURI()
me da la cadena"/foo/path/to/resource"
como se esperaba, perogetPathInfo()
para el mismoHttpServletRequest
objeto me danull
. ¿Qué sucede? EDITAR: se responde a continuación por el usuario "30thh".Pondré una pequeña tabla de comparación aquí (solo para tenerla en alguna parte):
Servlet se asigna como
/test%3F/*
y la aplicación se implementa en/app
.http://30thh.loc:8480/app/test%3F/a%3F+b;jsessionid=S%3F+ID?p+1=c+d&p+2=e+f#a
En el ejemplo anterior, el servidor se ejecuta en
localhost:8480
y el nombre30thh.loc
se puso en elhosts
archivo del sistema operativo .Comentarios
"+" se maneja como espacio solo en la cadena de consulta
El ancla "#a" no se transfiere al servidor. Solo el navegador puede trabajar con él.
Si el
url-pattern
mapeo en el servlet no termina con*
(por ejemplo/test
o*.jsp
),getPathInfo()
regresanull
.Si se usa Spring MVC
El método
getPathInfo()
vuelvenull
.El método
getServletPath()
devuelve la parte entre la ruta de contexto y la ID de sesión. En el ejemplo anterior, el valor sería/test?/a?+b
Tenga cuidado con las partes codificadas con URL de
@RequestMapping
y@RequestParam
en Spring. Tiene errores (versión actual 3.2.4) y generalmente no funciona como se esperaba .fuente
If the url-pattern in the servlet mapping does not end with * (for example /test or *.jsp), getPathInfo() returns null.
brillante.getRequestURI()
ygetRequestURL()
debería devolver jsessionid no decodificado, en este casoS%3F+ID
. Al menos lo hace en Tomcat / 8.5.6.Analicemos la URL completa que un cliente escribiría en su barra de direcciones para llegar a su servlet:
http://www.example.com:80/awesome-application/path/to/servlet/path/info?a=1&b=2#boo
Las partes son:
http
www.example.com
80
awesome-application
path/to/servlet
path/info
a=1&b=2
boo
El URI de solicitud (devuelto por getRequestURI ) corresponde a las partes 4, 5 y 6.
(por cierto, aunque no esté solicitando esto, el método getRequestURL le proporcionará las partes 1, 2, 3, 4, 5 y 6).
Ahora:
Siempre se cumple lo siguiente (excepto las diferencias de codificación de URL):
El siguiente ejemplo de la especificación Servlet 3.0 es muy útil:
Nota: la imagen sigue, no tengo tiempo para recrear en HTML:
fuente
Considere la siguiente configuración de servlet:
Ahora, cuando llego a la URL
http://localhost:8084/JSPTemp1/NewServlet/jhi
, invocaráNewServlet
como está mapeado con el patrón descrito anteriormente.Aquí:
Tenemos esos:
getPathInfo()
getRequestURI()
fuente