Проблемы с отображением перехватчика Spring MVC

#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 /**»/> .