web.xml中的URL模式太宽容了吗?

时间:2016-08-22 04:45:05

标签: tomcat servlets web.xml

我有一个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应支持来自GET的{​​{1}}等REST调用。

但是,所发生的情况是,从浏览器开始以http://myserver/myapp/rest1?param=1开头的所有URL调用显然会导致使用http://myserver/myapp/调用servlet的doGet()方法。

但是,如果给定request.pathInfo() == null s,则网址url-pattern不会导致http://myserver/myapp/rest1?param=1,并且"/rest1".equals(request.pathInfo())等网址格式不会导致HTTP响应404来自servlet?

servlet正在Apache Tomcat 9上运行。

2 个答案:

答案 0 :(得分:1)

更改为这些网址模式证明最有效:

<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之前的答案中得到了很好的解释。

答案 1 :(得分:0)

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