Spring MVC拦截器映射问题

发布于 2021-02-02 11:28:29

我有这段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拦截器。但是,使用它们,页面拦截器总是被调用。我只希望为页面调用页面拦截器。我如何做到这一点?

关注者
0
被浏览
80
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    假设您为页面使用一致的命名方案,请使用该命名方案-例如,如果您的外部可见页面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认为/**只是注释:-)



推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看