#java #spring #spring-mvc
#java #весна #весна-mvc #spring #spring-mvc
Вопрос:
У меня есть этот сегмент XML:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/statics/**" />
<bean class="com.company.website.servlet.StaticsHandlerInterceptor" />
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/data/**" />
<bean class="com.company.website.servlet.AJAXHandlerInterceptor" />
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.company.website.servlet.PageHandlerInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
У меня есть три разных перехватчика по определенной причине, хотя StaticsHandlerInterceptor
это всего лишь preHandle
метод, возвращающий true
(для всего моего статического контента (js, css и т.д.)). Вторая проблема касается запросов AJAX. Третий — для реальных страниц. То, что я вижу, происходит, — это статика и перехватчики AJAX, вызываемые тогда, когда они должны быть; однако с ними всегда вызывается перехватчик страницы. Я хочу, чтобы перехватчик страниц вызывался только для страниц. Как мне сделать так, чтобы это произошло?
Ответ №1:
Предполагая, что вы используете согласованную схему именования для своих страниц, используйте это — например, если URL-адреса вашей внешне видимой страницы заканчиваются на .html
, укажите:
<mvc:mapping path="/**/*.html" />
Однако иметь подобные «расширения» не очень удобно — вы можете предпочесть использовать схему, подобную:
- GET of
/user/{id}
= возвращает пользовательский объект для пользователя {id} в формате JSON - POST to
/user/{id}
= обновляет пользовательский объект из объекта JSON - GET to
/user/page/{id}
= возвращает HTML-страницу для пользователя {id} - и т.д. и т.п.
Затем вы можете использовать приятное для чтения семантическое отображение, например:
<mvc:mapping path="/**/page/**" />
который будет работать на любой «глубине» структуры URL.
Редактировать: Итак, похоже, что использование стиля объявления компонента mvc: interceptors не даст вам выразительности, необходимой для указания исключения по шаблону, а не включения.
Из того, что я могу разобрать в этом блоге, использование более подробного HandlerMapping
подхода позволит вам инвертировать логику сопоставления — вы можете указать, с чем не следует сопоставлять, чтобы получить то, что вам нужно:
<bean id="nonStaticNonDataMapper" class="org.springplugins.web.IgnoreSelectedAnnotationHandlerMapping">
<property name="order">
<value>0</value>
</property>
<property name="urls">
<list>
<value>/statics/**</value>
<value>/data/**</value>
</list>
</property>
<property name="interceptors">
<list>
<bean class="com.company.website.servlet.PageHandlerInterceptor" />
</list>
</property>
(Приносим извинения за форматирование приведенного выше фрагмента, Markdown считает, что /**
это комментарий 🙂
Комментарии:
1. Проблема в том, что у меня есть URL-адреса типа ‘~ / index’ и ‘~ / preferences’. Если URL-адрес ‘~/data/**’, это запрос AJAX. Если URL-адрес ‘~/statics/**’, это запрос на статическое содержимое. В противном случае это будет запрос страницы, а у меня нет расширений на моих страницах.
Ответ №2:
mvc: перехватчики теперь поддерживают исключение определенного отображения. В настоящее время это доступно только в Spring 3.2.0.M2. Вы можете найти больше об этом в элементе JIRA (который теперь решен):https://jira.springsource.org/browse/SPR-6570
Комментарии:
1. Обратите внимание, что в отличие от того, что указано в SPR-6570, вместо этого следует использовать не <mvc:exclude-pattern path=»/admin/**»>, а <mvc:exclude-mapping path=»/admin /**»/> .