2010-11-25 14 views
101

El método request.getRequestURI() devuelve el URI con la ruta de contexto.¿Cómo obtener URI de solicitud sin ruta de contexto?

Por ejemplo, si la URL base de una aplicación es http://localhost:8080/myapp/ (es decir, la ruta de contexto es miaplicacion), y llaman request.getRequestURI() para http://localhost:8080/myapp/secure/users, devolverá /myapp/secure/users.

¿Hay alguna manera en que podamos obtener solo esta parte /secure/users, es decir, el URI sin ruta de contexto?

+2

posible duplicado de [¿Cuál es la diferencia entre los métodos getRequestURI y getPathInfo en HttpServletRequest?] (http://stackoverflow.com/questions/4931323/whats-the-difference-between-getrequesturi-and-getpathinfo-methods-in-httpservl) – Leonel

Respuesta

124

Si está dentro de un servlet controlador de frente que se asigna en un patrón de prefijo , entonces solo puede usar HttpServletRequest#getPathInfo().

String pathInfo = request.getPathInfo(); 
// ... 

Suponiendo que el servlet en su ejemplo se asigna en /secure, entonces esto va a volver /users que sería la información de interés exclusivo en el interior de una típica servlet controlador frontal.

Sin embargo, si el servlet está mapeado en un patrón de sufijo (los ejemplos de su URL no indican que sea así), o cuando está realmente dentro de un filtro (cuando el servlet a ser invocado no es necesariamente determinado aún, por lo que podría volver getPathInfo()null), entonces su mejor apuesta es subcadena de la URI de la solicitud a sí mismo dependiendo de la duración de la ruta de contexto utilizando el método habitual String:

HttpServletRequest request = (HttpServletRequest) req; 
String path = request.getRequestURI().substring(request.getContextPath().length()); 
// ... 
+0

¿Hay alguna razón para usar esto en lugar de 'getServletPath()'? Estoy escribiendo un filtro y noté que getPathInfo() 'devuelve' null', pero 'getServletPath()' devuelve la ruta menos el contexto (adecuado para pasar al despachador de solicitudes). –

+0

@JasonC: como se responde, 'getPathInfo()' devuelve nulo si el servlet del controlador frontal no está mapeado en un patrón de prefijo. – BalusC

+0

Sí. Quería decir: ¿hay alguna razón por la que prefiera getPathInfo sobre getServletPath? Muchas de las otras respuestas altas aquí no usan getServletPath tampoco, que es lo que me hace sospechar y por qué me estoy preguntando. Tengo un proyecto de servlet en el que estoy trabajando y estoy tratando de pulir mis habilidades. –

2

Una manera de hacer esto es descansar la ruta de contexto de servelet desde el URI de solicitud.

String p = request.getRequestURI(); 
String cp = getServletContext().getContextPath(); 

if (p.startsWith(cp)) { 
    String.err.println(p.substring(cp.length()); 
} 

Leer here.

-1

Puede ser que sólo puede utilizar el método de división para eliminar la '/ miaplicacion' por ejemplo:

string[] uris=request.getRequestURI().split("/"); 
string uri="/"+uri[1]+"/"+uris[2]; 
+2

Esto causará problemas si despliegue mi aplicación como raíz y se convierte su URL base http: // localhost: 8080 /. En este caso, request.getRequestURI() devolverá "/ secure/user" y su método de división causará problemas aquí. El código no debería depender de la implementación. – craftsman

60
request.getRequestURI().substring(request.getContextPath().length()) 
+0

¡Impresionante! Esto es exactamente lo que estaba buscando. – craftsman

+4

+1 Creo que esta es una mejor respuesta que getPathInfo debido a que getPathInfo puede ser nulo y otras rarezas. El código de Varios Spring obtiene getContextPath y lo elimina del URI tal como lo hizo en lugar de getPathInfo. –

+2

¿Funcionará esto con los servlets que necesitan un equilibrador de carga? –

11

getPathInfo() a veces devuelto nulo. En la documentación HttpServletRequest

Este método devuelve nulo si no había información de ruta adicional.

Necesito obtener la ruta al archivo sin la ruta de contexto en Filter y getPathInfo() return me null. Así que utilizar otro método: httpRequest.getServletPath()

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
{ 
    HttpServletRequest httpRequest = (HttpServletRequest) request; 
    HttpServletResponse httpResponse = (HttpServletResponse) response; 

    String newPath = parsePathToFile(httpRequest.getServletPath()); 
    ... 

} 
4

Si utiliza request.getPathInfo() dentro de un filtro, parece que siempre para conseguir nulo (al menos con embarcadero).

Este error no válido escueta + respuesta alude a la cuestión que pienso:

https://issues.apache.org/bugzilla/show_bug.cgi?id=28323

que sospechan que está relacionado con el hecho de que los filtros antes de ejecutar el servlet recibe la solicitud. Puede ser un error en el contenedor o un comportamiento esperado que no he podido identificar.

contextPath está disponible, por lo que la solución de Fforws funciona incluso en filtros. No me gusta tener que hacerlo a mano, pero la aplicación está roto o

19

con el resorte que puede hacer:

String path = new UrlPathHelper().getPathWithinApplication(request); 
+0

Por supuesto, tendría sentido mantener una instancia de UrlPathHelper, p. como una variable de miembro de clase ... – James

Cuestiones relacionadas