【问题标题】:Spring MVC Interceptor Mapping ProblemsSpring MVC 拦截器映射问题
【发布时间】:2011-12-24 01:30:21
【问题描述】:

我有这段 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 只是返回true 的preHandle 方法(对于我所有的静态内容(js、css 等))。第二个用于 AJAX 请求。第三个是实际页面。我看到发生的是静态和 AJAX 拦截器在它们应该被调用的时候被调用;然而,有了它们,页面拦截器总是被调用。我只希望为页面调用页面拦截器。我该如何做到这一点?

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    假设您为页面使用一致的命名方案,请使用 - 例如如果您的外部可见页面 URL 以 .html 结尾,请指定:

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

    不过,拥有这样的“扩展”并不是很 RESTful - 您可能更喜欢使用如下方案:

    • /user/{id} 的 GET = 返回用户 {id} 的用户对象,JSON 格式
    • POST 到 /user/{id} = 从 JSON 对象 更新用户对象
    • GET to /user/page/{id} = 返回用户 {id}
    • 的 HTML 页面
    • 等等等等

    然后你可以使用一个可读性好的语义映射,比如:

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

    适用于任何“深度”的 URL 结构。

    编辑: 好的,所以看起来使用mvc:interceptors bean 声明样式不会给您提供通过模式指定排除所需的表现力,而不是而不是包容。

    根据我在this blog 中的了解,使用更详细的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>
    

    (对上述 sn-p 的格式表示歉意,Markdown 认为 /** 是评论 :-)

    【讨论】:

    • 问题是我有像“~/index”和“~/preferences”这样的URL。如果 URL 是 '~/data/**',则它是一个 AJAX 请求。如果 URL 是 '~/statics/**',则它是对静态内容的请求。否则,这将是一个页面请求,我的页面上没有扩展。
    【解决方案2】:

    mvc:interceptors 现在支持排除特定映射。目前它仅在 Spring 3.2.0.M2 中可用。您可以在 JIRA 项目中找到更多相关信息(现已解决):https://jira.springsource.org/browse/SPR-6570

    【讨论】:

    • 请注意,与 SPR-6570 中所述的不同,不是 而是 应改为使用。
    猜你喜欢
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 2013-06-21
    • 2020-11-30
    相关资源
    最近更新 更多