Метод request.getRequestURI () возвращает URI с контекстным путем.
Например, если базовый URL из приложения http://localhost:8080/myapp/
(то есть контекст путь MyApp ), и я призываю request.getRequestURI()
к http://localhost:8080/myapp/secure/users
, он вернется /myapp/secure/users
.
Есть ли способ получить только эту часть /secure/users
, то есть URI без контекстного пути?
Ответы:
Если вы находитесь внутри сервлета переднего контроллера, который отображается в шаблоне префикса, вы можете просто использовать
HttpServletRequest#getPathInfo()
.Предполагая, что сервлет в вашем примере сопоставлен
/secure
, тогда будет возвращена/users
информация, представляющая единственный интерес внутри типичного сервлета фронт-контроллера.Однако, если сервлет сопоставлен с шаблоном суффикса (ваши примеры URL, однако, не указывают, что это так) или когда вы на самом деле находитесь внутри фильтра (когда сервлет, который должен быть запущен, еще не обязательно определен, поэтому
getPathInfo()
может вернутьсяnull
), то лучше всего самостоятельно подставить URI запроса на основе длины контекстного пути, используя обычныйString
метод:источник
getServletPath()
? Я пишу фильтр и заметил, что онgetPathInfo()
возвращаетсяnull
, ноgetServletPath()
возвращает путь без контекста (подходит для передачи диспетчеру запросов).getPathInfo()
возвращает null, если сервлет переднего контроллера не сопоставлен с шаблоном префикса./foo.xhtml
вместо/foo.jsf
), а не фактический URI запроса (тот, который конечный пользователь увидит в адресной строке браузера). Однако исходный путь сервлета в таком случае разрешается как атрибут запроса с ключомRequestDispatcher.FORWARD_SERVLET_PATH
. В любом случае вопрос явно запрашивает URI запроса (как в адресной строке браузера), поэтому ответ основан на этом.источник
С Spring вы можете:
источник
getPathInfo () иногда возвращает значение null. В документации HttpServletRequest
Мне нужно получить путь к файлу без пути контекста в фильтре, а getPathInfo () вернет мне значение null. Поэтому я использую другой метод: httpRequest.getServletPath ()
источник
Если вы используете request.getPathInfo () внутри фильтра, вам всегда кажется, что вы получаете null (по крайней мере, с причалом).
Этот краткий недействительный ответ с ошибкой + намекает на проблему, которую я думаю:
https://issues.apache.org/bugzilla/show_bug.cgi?id=28323
Я подозреваю, что это связано с тем, что фильтры запускаются до того, как сервлет получит запрос. Это может быть ошибка контейнера или ожидаемое поведение, которое я не смог определить.
Однако contextPath доступен, поэтому решение fforws работает даже в фильтрах. Мне не нравится делать это вручную, но реализация не работает или
источник
Один из способов сделать это - оставить путь контекста сервлета из URI запроса.
Прочтите здесь .
источник
Возможно, вы можете просто использовать метод разделения, чтобы удалить '/ myapp', например:
источник