【问题标题】:Is it possible to use regular expression for Jetty's servlet-mapping?是否可以对 Jetty 的 servlet 映射使用正则表达式?
【发布时间】:2011-06-15 10:47:00
【问题描述】:

我有这个映射

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

但我也想要 /服务/主 映射到主 servlet。

<servlet-mapping>
<servlet-name>master</servlet-name>
<url-pattern>/service/master</url-pattern>
</servlet-mapping>

我认为这里存在冲突,因为调用 /service/* 将立即触发服务 servlet。有没有办法让我在 servlet-mapping 中使用某种排除,或者可能是正则表达式来做我想做的事?

【问题讨论】:

    标签: java servlets jetty


    【解决方案1】:

    您可以尝试使用 Google Guice。 com.google.inject.servlet.ServletModule.serveRegex(字符串正则表达式,字符串...正则表达式) 将让您在映射中使用正则表达式。

    看这里http://code.google.com/p/google-guice/wiki/ServletModule

    【讨论】:

      【解决方案2】:

      Servlet 映射始终使用最具体的匹配,因此路径 &lt;context&gt;/service/master 将始终映射到 master

      这是Servlet 3.0 spec 的第一条映射规则:

      1. 容器将尝试找到与请求路径完全匹配的 到 servlet 的路径。一种 成功匹配选择 servlet。
      2. 容器将递归地尝试匹配最长的路径前缀。这 是通过走下路径树来完成的 一次一个目录,使用'/' 字符作为路径分隔符。这 最长匹配确定 servlet 已选中。
      3. 如果 URL 路径中的最后一段包含扩展名(例如 .jsp),servlet 容器将尝试 匹配处理的 servlet 延期申请。一个 扩展被定义为 最后一个“。”之后的最后一段 字符。
      4. 如果前三个规则都没有导致 servlet 匹配,则 容器将尝试服务 适合资源的内容 请求。如果“默认”servlet 是 为应用程序定义,它将 使用。许多容器提供了一个 用于服务的隐式默认 servlet 内容。

      【讨论】:

      • 所以你是说我的映射是正确的?好吧,我试过了,/service/master 没有映射到主 servlet
      • 尝试另一个容器,例如雄猫。在 Jetty 上,我经常看到类似的怪事。
      • 作为一种解决方法,请先尝试使用主映射(尚未对其进行测试,但我认为这可能会起作用)。
      • @denniss - 1) 你使用的是什么版本的 Jetty? 2) 你的 web.xml 是什么版本?在 Servlet 2.5 之前,请求映射的规则是礼貌的建议,所以也许 Jetty 不符合。另外,请注意映射区分大小写,所以/service/master 应该匹配 master/service/MASTER 应该匹配 service
      • 我刚刚在 Jetty 6.1.15 上做了一个快速测试,它工作正常。请注意,尽管 McDowell 关于区分大小写的评论适用,并且您在 master 上没有通配符,所以它匹配 service/master 但不匹配 service/master/x
      猜你喜欢
      • 2023-02-01
      • 2011-12-10
      • 2016-10-14
      • 2016-06-24
      • 2021-03-09
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多