Spring MVC и RequestMapping с фильтром

У меня проблема с сопоставлением 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;
}

Это сработало, и теперь я могу внутренне видеть, что шаблон не обрабатывает «неправильные» запросы, подобные тем, которые я упомянул в начале.

Спасибо вам всем


person Javier Moreno Garcia    schedule 03.10.2012    source источник
comment
Интересно, что в первом блоке кода есть ошибка, код после пути /* становится серым, но это не комментарий, так как это XML...   -  person manub    schedule 03.10.2012
comment
@manub Это ошибка плагина подсветки синтаксиса SO;)   -  person sp00m    schedule 03.10.2012


Ответы (1)


Первый вопрос

Мой @RequestMapping не является /qwert/request.do, как запрос может попасть в сервлет?

Весна по умолчанию берёт

/qwert/request.do 
/qwert/request.whatever
/qwert/request.*

подобно

/qwert/request 

поэтому ваш запрос @RequestMapping(value = "/qwert/request", method = RequestMethod.POST)take. Измените свой DefaultAnnotationHandlerMapping для изменения этой опции по умолчанию:

 <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
     <property name="useDefaultSuffixPattern" value="false" />
 </bean>

Из источника Spring:

setUseDefaultSuffixPattern

public void setUseDefaultSuffixPattern (логическое значение useDefaultSuffixPattern)

Укажите, следует ли регистрировать пути с использованием шаблона суффикса по умолчанию: т. е. следует ли регистрировать "/users" как "/users." и "/users/". По умолчанию "истина". Отключите это соглашение, если вы намерены строго интерпретировать пути @RequestMapping. Обратите внимание, что пути, которые включают суффикс «.xxx» или заканчиваются на «/», ни в коем случае не будут преобразованы с использованием шаблона суффикса по умолчанию.*

person Jhonathan    schedule 03.10.2012
comment
Спасибо за помощь, но пока не работает. После введения @Bean DefaultAnnotationHandlerMapping с setUseDefaultSuffixPattern как false ситуация такая же. Теперь я вижу, что мой DefaultAnnotationHandlerMapping возвращает для моего bean-компонента сопоставление [/qwert/request] (когда setUseDefaultSuffixPattern равно false) и [/qwert/request, /qwert/request.*, /qwert/request/] (с setUseDefaultSuffixPattern как true ) Но независимо от setUseDefaultSuffixPattern в мой контроллер продолжают поступать неправильные запросы. Это действительно странно. - person Javier Moreno Garcia; 03.10.2012