Spring MVC Проблемы с отображением перехватчиков - PullRequest
2 голосов
/ 08 ноября 2011

У меня есть этот сегмент 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 вызываются, когда они должны быть; однако с ними всегда вызывается перехватчик страниц. Я только хочу, чтобы перехватчик страниц вызывался для страниц. Как мне это сделать?

Ответы [ 2 ]

6 голосов
/ 06 октября 2012

mvc: перехватчики теперь поддерживают исключение определенного отображения.В настоящее время он доступен только весной 3.2.0.M2.Вы можете найти больше об этом в пункте JIRA (который теперь решен): https://jira.springsource.org/browse/SPR-6570

6 голосов
/ 08 ноября 2011

Предполагая, что вы используете согласованную схему именования для своих страниц, используйте это, например. если внешние URL-адреса страницы заканчиваются на .html, укажите:

<mvc:mapping path="/**/*.html" />

Впрочем, иметь такие "расширения" не очень приятно - вы можете использовать схему вроде:

  • GET из /user/{id} = возвращает объект пользователя для пользователя {id}, формат JSON
  • POST в /user/{id} = обновляет объект пользователя из JSON-объект
  • GET to /user/page/{id} = возвращает HTML-страницу для пользователя {id}
  • и т. Д. И т. П.

Затем вы можете использовать удобочитаемое семантическое отображение, например:

<mvc:mapping path="/**/page/**" />

, которая будет работать на любой «глубине» структуры URL.

Редактировать: ОК, так что кажется, что использование стиля бобов mvc: interceptors не даст вам выразительности, которую вам нужно указать exclusion по шаблону, а не по включению.

Из того, что я могу разглядеть в этом блоге , использование более многословного 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 считает, что /** - это комментарий: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...