usar servlet httpservlet example ejemplo contenedor java servlets

java - servlet - ¿Cómo obtener URI de solicitud sin ruta de contexto?



servlet java ejemplo (7)

El método request.getRequestURI() devuelve URI con la ruta de contexto.

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

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


Con Spring puedes hacer:

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


Puede ser que solo puedas usar el método de división para eliminar el ''/ myapp'', por ejemplo:

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


Si está dentro de un servlet de controlador frontal que está mapeado en un patrón de prefijo, entonces puede simplemente usar HttpServletRequest#getPathInfo() .

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

Suponiendo que el servlet en su ejemplo está mapeado /secure , esto devolverá /users que sería la información de interés exclusivo dentro de un servlet de controlador frontal típico.

Sin embargo, si el servlet está mapeado en un patrón de sufijo (los ejemplos de su URL no indican que este sea el caso), o cuando está realmente dentro de un filtro (cuando el servlet a ser invocado aún no está necesariamente determinado, entonces getPathInfo() podría devolver null ), entonces la mejor opción es subscribir el URI de solicitud en función de la longitud de la ruta de contexto utilizando el método String habitual:

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


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

Esta respuesta + error inválida alude al problema que creo:

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

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

Sin embargo, contextPath está disponible, de modo que la solución funciona incluso en filtros. No me gusta tener que hacerlo a mano, pero la implementación está rota o


Una forma 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()); }

Lea here .


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

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

Necesito obtener la ruta al archivo sin la ruta del contexto en Filter y getPathInfo () return me null. Entonces uso 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()); ... }


request.getRequestURI().substring(request.getContextPath().length())