2016-08-22 35 views
0

我有一个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调用像GEThttp://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.

回答

1

更改为这些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()现在总是返回null)之间的区别在that以前的答案很好解释。

+0

请注意,这也在servlet规范中有所解释。我知道更多的人通常不会阅读规范,因为它们是干燥且不可读的,但是Java Servlet规范并不是这些文档之一:它非常易读并且回答了关于事情应该如何行事的大多数问题。 –

+0

@ChristopherSchulz Thx参与回答为Tomcat的高级专家。顺便说一下,我刚刚删除了其他最近关于响应代码401/501之间混淆的问题。我对curl的命令行选项很蠢。用'curl -I'试过'curl -i'应该是合适的。重新THX。 – Drux

+0

是的,使用'curl -I'会发出'HEAD'请求。如果你的servlet不支持'doHead',那么你会得到一个501响应。 '-i'看起来像你想要的。 –

0

变化<url-pattern>/rest1*</url-pattern><url-pattern>/rest1/*</url-pattern>