Я знаю, что в JavaEE фильтры могут перехватывать любой запрос на сервлет. Но перехватчики в Spring MVC не совсем то же самое. Если вы посмотрите на диаграмму ниже, вы увидите, что перехватчики приходят после диспетчерского сервлета.Почему DispatcherServlet не вызывает мой HandlerInterceptor?
Позвольте мне привести пример, прежде чем задать свой вопрос.
У меня есть контроллер, который имеет 2 метода в нем, которые отображаются на два разных запроса. Один принимает запросы GET, а другой принимает запросы POST. Теперь, если я добавлю перехватчик в своем веб-приложении, этот перехватчик будет сидеть перед контроллером. Это означает, что до того, как будет применен метод контроллера, сначала request
ударит мой метод перехватчика preHandle
.
Теперь говорит, что в моем приложении, два контроллера методы выглядят следующим образом:
@Controller
public class myController{
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String test1(){
return "abc";
}
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String test1(){
return "xyz";
}
И позволяют сказать, что у меня есть простой перехватчик, как это:
public class URLInterceptors extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("REQUESTED SERVLET PATH IS: " + request.getServletPath());
return true;
}
}
Теперь, если я делаю GET запрос на /test
, мой перехватчик попал, и он печатает путь сервлета, но когда я делаю запрос GET
на /login
, я знаю, что он потерпит неудачу, потому что мой метод, который обрабатывает /login
, отображает только POST
запросы, однако до того, как он выкинет '405 Request method' GET 'not supported' error, он должен по крайней мере поразить первый мой перехватчик? Это не так. Я не хочу менять POST
на GET
. Итак, почему?