2017-01-13 5 views
0

Я знаю, что в 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. Итак, почему?

enter image description here

ответ

2

Часть этого объясняется в

В целом, DispatcherServlet попытки найти соответствующий обработчик для вашего запроса с помощью HandlerMapping (смотрите графику). Эти обработчики на самом деле являются адаптерами, которые обертывают метод фактического обработчика (в этом случае аннотированный метод) с зарегистрированными вами перехватчиками. Если этот обработчик найден, то DispatcherServlet может продолжить, вызвать перехватчики и, при необходимости, вызвать метод обработчика.

В вашем случае, потому что ваш @RequestMapping ограничивается POST запросов и ваш запрос является GET, то DispatcherServlet не удается найти соответствующий обработчик и поэтому возвращает ошибку, прежде чем он имел возможность ссылаться на какие-перехватчики.

Обратите внимание, что javadoc состояния

HandlerInterceptor вызывается перед соответствующим HandlerAdapter инициирует выполнение самого обработчика.

, но ваш DispatcherServlet так и не нашел обработчика.

Вместо этого вы можете использовать сервлет Filter.