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-pattern
s,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 之前的答案中有很好的解释。
我有一个带有 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-pattern
s,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 之前的答案中有很好的解释。