【问题标题】:How to stop Spring MVC blocking all other Servlets?如何停止 Spring MVC 阻塞所有其他 Servlet?
【发布时间】:2011-03-02 02:03:01
【问题描述】:

我正在使用 Spring 2.5 MVC 并想添加另一个第三方 Servlet。问题是,Spring MVC 捕获所有请求,因此 Servlet 没有收到任何请求。这里有一个 web.xml 片段:

SpringMVC org.springframework.web.servlet.DispatcherServlet 2

<servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>  

<servlet>
    <description>This is the servlet needed for cache.type servlet, returns the packed resources</description>
    <display-name>PackServlet</display-name>
    <servlet-name>PackServlet</servlet-name>
   <servlet-class>net.sf.packtag.servlet.PackServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>PackServlet</servlet-name>
    <url-pattern>*.pack</url-pattern>
</servlet-mapping>

应用程序确实需要 /* 映射,pack:tag(第三方 Servlet)确实需要基于文件扩展名的映射。 有没有可能告诉 Spring 不要处理请求? 谢谢和问候。

【问题讨论】:

    标签: java spring servlets spring-mvc


    【解决方案1】:

    其实你不需要spring做任何事情,servlet容器可以帮你解决。

    当匹配请求发送到哪个 servlet 时,取决于 url-pattern 定义的匹配规则。没有 2 个 servlet 可能具有相同的模式,但它们可能具有重叠的模式。然后适用 4 条规则:

    1) 完全匹配优先于通配符匹配 2) 较长的路径模式优先于较短的模式 3) 路径匹配优先于文件类型匹配 4) / 匹配任何尚未匹配的内容

    <servlet-mapping>
      <servlet-name>PackServlet</servlet-name>
      <url-pattern>*.pack</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
      <servlet-name>SpringMVC</servlet-name>
      <url-pattern>/</url-pattern>
    </servlet-mapping>
    

    如果你对 SpringMVC 使用 /*,它可能会匹配最长的路径。通过删除 *,您肯定会遵循默认 servlet 的 servlet 规范,并符合规则 4。

    Here you can find some more details.

    【讨论】:

    • 你的 都以 结尾,尝试纠正那些发现这些有用的人可能会复制粘贴这个 sn-p
    【解决方案2】:

    检查此 SO 问题的已接受答案。它应该可以解决您的问题。

    Can SpringMVC be configured to process all requests, but exclude static content directories?

    【讨论】:

      猜你喜欢
      • 2014-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多