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拦截器。但是,使用它们,页面拦截器总是被调用。我只希望为页面调用页面拦截器。我如何做到这一点?
问题答案:
假设您为页面使用一致的命名方案,请使用该命名方案-例如,如果您的外部可见页面URL以结尾.html
,请指定:
<mvc:mapping path="/**/*.html" />
尽管具有这样的“扩展”并不是很RESTful-您可能更喜欢使用以下方案:
- GET
/user/{id}
= =返回用户{id}的用户对象,JSON格式 - POST
/user/{id}
=从 JSON对象 更新用户 对象 - GET to
/user/page/{id}
=返回用户{id}的 HTML页面 - 等
然后,您可以使用一个不错的可读性,语义映射,例如:
<mvc:mapping path="/**/page/**" />
这将适用于URL结构的任何“深度”。
编辑:
确定,所以看来使用mvc:interceptors风格的bean声明不会为您提供表达能力,您需要通过模式而不是包含来指定 排除 。
根据我在本博客中所得出的结论,使用更详细的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认为/**
只是注释:-)