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 mismoHttpServletRequestobjeto 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#aEn el ejemplo anterior, el servidor se ejecuta en
localhost:8480y el nombre30thh.locse puso en elhostsarchivo 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-patternmapeo en el servlet no termina con*(por ejemplo/testo*.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?+bTenga cuidado con las partes codificadas con URL de
@RequestMappingy@RequestParamen 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:
httpwww.example.com80awesome-applicationpath/to/servletpath/infoa=1&b=2booEl 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áNewServletcomo está mapeado con el patrón descrito anteriormente.Aquí:
Tenemos esos:
getPathInfo()getRequestURI()fuente