У меня проблема с сопоставлением URL-адресов, и я подумал, что кто-нибудь может мне помочь :-)
Мое приложение Spring MVC имеет отображение диспетчера серверов следующим образом:
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
Затем у меня есть сервлет контроллера с методом, аннотированным следующим образом:
MyServlet {
....myMethod
@RequestMapping(value = "/qwert/request", method = RequestMethod.POST)
В заключение у меня есть DelegatingFilterProxy с отображением:
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/qwert/request</url-pattern>
</filter-mapping>
целью которого является перехват всех запросов, направленных на вышеупомянутый метод MyServlet.
Приложение нормально работает для типичного запроса localhost:port/MyApp/qwert/request, что означает, что фильтр перехватывает запросы и выполняет свою работу.
Проблема в том, что такой запрос localhost:port/MyApp/qwert/request.do попадает непосредственно в метод сервлета (MyServlet), минуя фильтр. Мой @RequestMapping не является /qwert/request.do, как запрос может попасть в сервлет?
Есть ли у кого-нибудь идеи, как решить эту проблему, не меняя отображение моего диспетчерского сервлета на что-то вроде *.do и внося соответствующие другие изменения.
Я хочу, чтобы мое приложение обслуживало запросы в localhost:port/MyApp/qwert/request, а не в localhost:port/MyApp/qwert/request.whatever, и я не могу изменить сопоставление фильтра с /*, так как существуют другие методы, не требующие вмешательства фильтра.
Спасибо
Обновление 1:
Да, я пытался ввести шаблон URL-адреса фильтра, например /qwert/request.*, но в этом случае фильтр не перехватывает запросы. Ни localhost:port/MyApp/qwert/request, ни localhost:port/MyApp/qwert/request.whatever (будучи первым, который должны использовать обычные вызывающие абоненты)
Решение
В конце концов я нашел, в чем проблема, @Jhonathan указал мне правильное направление.
Мне пришлось определить RequestMappingHandlerMapping вместо DefaultAnnotationHandlerMapping.
@Bean
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
RequestMappingHandlerMapping mapping = new RequestMappingHandlerMapping();
// no dot like names will be matched
mapping.setUseSuffixPatternMatch(false);
// no trailing slash will be matched
mapping.setUseTrailingSlashMatch(false);
return mapping;
}
Это сработало, и теперь я могу внутренне видеть, что шаблон не обрабатывает «неправильные» запросы, подобные тем, которые я упомянул в начале.
Спасибо вам всем