#spring-mvc #controller
#spring-mvc #контроллер
Вопрос:
Я работал с сервлетом, который необходимо преобразовать в контроллер Spring MVC, чтобы иметь доступ к компонентам spring и т.д. Почему в обычном servlet request.getPathInfo()
return not null
, но в Spring Controller я получаю нулевое значение? Я знаю, что могу использовать @PathVariable
, но интересно, почему результаты этого метода отличаются?
@RequestMapping(value = {"/test", "/test/*"})
public void test(HttpServletRequest req, HttpServletResponse res) {
log.info(req.getPathInfo() == null); // true!
if (req.getMethod().equalsIgnoreCase("get")) {
// analogue to doGet...
} else {
// analogue to doPost...
}
}
Комментарии:
1. какой URL-адрес вы нажимаете?
2. URL:
http://localhost:8080/myApp/test/hello
.req.getPathInfo()
возвращает shuld/hello
Ответ №1:
Я думаю, что решение находится в javadoc getPathInfo()
Дополнительная информация о пути следует за путем сервлета, но предшествует строке запроса и будет начинаться с символа «/».
В случае Spring путь к сервлету является полным путем, следовательно, если вы вызываете getServletPath(), он всегда будет возвращать полный URI, а getPathInfo() ничего не вернет.
Комментарии:
1. К настоящему моменту это, безусловно, должно быть отмечено как правильный ответ.
2. Это здорово, спасибо. Дело в том, что у меня есть этот фильтр, используемый многими различными приложениями, некоторые spring boot, другие нет. Итак, мне нужно провести различие в фильтре между запросом, поступающим из spring boot, или нет. Есть ли хороший способ сделать это, кроме простой проверки как getPathInfo (), так и getServletPath(). Что-то вроде этого ` if(null != getPathInfo()){ path = getPathInfo(); }else{ path = getServletPath(); } `