我有这段 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 of
/user/{id}
= 返回用户 {id} 的用户对象,JSON 格式
- POST to
/user/{id}
= 更新 User 对象JSON 对象
- GET to
/user/page/{id}
= 返回HTML 页面对于用户 {id}
- 等等等等
然后你可以使用一个可读性好的语义映射,例如:
<mvc:mapping path="/**/page/**" />
这适用于任何“深度”的 URL 结构。
Edit:好的,看来使用MVC:拦截器bean 声明的风格不会给你需要指定的表现力排除通过模式而不是包容性。
从我能看出的这个博客,使用更详细的HandlerMapping
方法将使您能够invert匹配逻辑 - 你可以指定什么not匹配以获得您需要的东西:
<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 认为/**
是一条评论:-)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)