Как получить URI запроса без контекстного пути?

Метод request.getRequestURI() возвращает URI с контуром.

Например, если базовый URL-адрес приложения http://localhost:8080/myapp/ (т.е. путь контекста myapp), и я вызываю request.getRequestURI() для http://localhost:8080/myapp/secure/users, он вернет /myapp/secure/users,

Есть ли способ получить только эту часть /secure/users, то есть URI без контекстного пути?

Ответ 1

Если вы находитесь внутри сервлета переднего контролера, который отображается на шаблоне префикса, вы можете просто использовать HttpServletRequest#getPathInfo().

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

Предполагая, что сервлет в вашем примере отображается на /secure, тогда он вернет /users, который будет представлять информацию, представляющую особый интерес внутри типичного сервлета контроллера.

Если сервлет, однако, отображается в шаблоне суффикса (ваши примеры URL, однако, не указывают на то, что это так) или когда вы фактически находитесь внутри фильтра (когда сервлет, вызываемый вызовом, не обязательно определяется тем не менее, поэтому getPathInfo() может возвращать null), то лучше всего подстроить URI запроса самостоятельно на основе длины пути контекста с помощью обычного метода String:

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

Ответ 2

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

Ответ 3

С помощью Spring вы можете:

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

Ответ 4

getPathInfo() иногда возвращает null. В документации HttpServletRequest

Этот метод возвращает значение null, если дополнительной информации о пути не было.

Мне нужно получить путь к файлу без контекстного пути в Filter и getPathInfo() return me null. Поэтому я использую другой метод: 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());
    ...

}

Ответ 5

Если вы используете request.getPathInfo() внутри фильтра, вы всегда получаете нулевое значение (по крайней мере, с причалом).

Этот краткий неверный ответ + ответ ссылается на проблему, я думаю:

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

Я подозреваю, что это связано с тем, что фильтры запускаются до того, как сервлет получит запрос. Это может быть ошибка контейнера или ожидаемое поведение, которое я не смог идентифицировать.

Доступен контекстный параметр, поэтому решение fforws работает даже в фильтрах. Мне не нравится делать это вручную, но реализация нарушена или

Ответ 6

Способ сделать это состоит в том, чтобы поместить путь контекста подателя из URI запроса.

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

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

Прочитайте здесь.

Ответ 7

Может быть, вы можете просто использовать метод split для исключения '/myapp' например:

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