URL web.xml 中的模式过于宽容?

URL patterns in web.xml too permissive?

我有一个带有 web.xml 的 servlet,如下所示:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
  id="WebApp_ID" version="3.0">
  <welcome-file-list>
    <welcome-file>/</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>myservlet</servlet-name>
    <servlet-class>com.mydomain.myapp.MyServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>myservlet</servlet-name>
    <url-pattern>/</url-pattern>
    <url-pattern>/rest1*</url-pattern>
    <url-pattern>/rest2*</url-pattern>
    <url-pattern>/rest3*</url-pattern>
  </servlet-mapping>
</web-app>

最终,servlet 应该支持来自 http://myserver/myapp/rest1?param=1.

GET 等 REST 调用

但是,发生的情况是浏览器对以 http://myserver/myapp/ 开头的 URL 的所有调用显然会导致使用 request.pathInfo() == null 调用 servlet 的 doGet() 方法.

但是,对于给定的 url-patterns,URL http://myserver/myapp/rest1?param=1 不会导致 "/rest1".equals(request.pathInfo()) 并且 URL 模式应该是 http://myserver/myapp/foo 不会导致来自 servlet 的 HTTP 响应 404?

Apache Tomcat9.

上的 servlet 是 运行

<url-pattern>/rest1*</url-pattern> 更改为 <url-pattern>/rest1/*</url-pattern>

事实证明,更改为这些 URL 模式最有效:

<url-pattern></url-pattern>
<url-pattern>/rest1</url-pattern>
<url-pattern>/rest2</url-pattern>
<url-pattern>/rest3</url-pattern>

密钥从 / 变为空 URL 模式。 this 之前的回答中很好地解释了这两个和其他关键模式之间的区别。

我现在使用 getServletPath() 而不是 getPathInfo()doGet() 内进一步调度。这些函数和其他函数之间的区别(以及为什么 getPathInfo() 现在总是 returns null)在 that 之前的答案中有很好的解释。