2016-08-22 60 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>