我有一个servlet与web.xml
如下:web.xml中的URL模式过于宽容?
<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应该支持REST调用像GET
从http://myserver/myapp/rest1?param=1
。
然而,所发生的情况是,从浏览器开始以http://myserver/myapp/
开头的URL的所有调用显然导致调用与request.pathInfo() == null
的小服务器的doGet()
方法。
但随后,用给定的url-pattern
S,应的URL http://myserver/myapp/rest1?param=1
不会导致"/rest1".equals(request.pathInfo())
和应该如http://myserver/myapp/foo
URL模式不会导致从servlet HTTP响应404?
该servlet在Apache Tomcat运行9.
请注意,这也在servlet规范中有所解释。我知道更多的人通常不会阅读规范,因为它们是干燥且不可读的,但是Java Servlet规范并不是这些文档之一:它非常易读并且回答了关于事情应该如何行事的大多数问题。 –
@ChristopherSchulz Thx参与回答为Tomcat的高级专家。顺便说一下,我刚刚删除了其他最近关于响应代码401/501之间混淆的问题。我对curl的命令行选项很蠢。用'curl -I'试过'curl -i'应该是合适的。重新THX。 – Drux
是的,使用'curl -I'会发出'HEAD'请求。如果你的servlet不支持'doHead',那么你会得到一个501响应。 '-i'看起来像你想要的。 –