【问题标题】:URL patterns in web.xml too permissive?web.xml 中的 URL 模式过于宽松?
【发布时间】:2016-08-22 04:45:04
【问题描述】:

我有一个带有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 应该支持 REST 调用,例如来自 http://myserver/myapp/rest1?param=1GET

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

但是,对于给定的url-patterns,URL http://myserver/myapp/rest1?param=1 是否应该不会导致 "/rest1".equals(request.pathInfo()),并且 URL 模式(例如 http://myserver/myapp/foo)是否应该不会导致来自 servlet 的 HTTP 响应 404?

servlet 在 Apache Tomcat 9 上运行。

【问题讨论】:

    标签: tomcat servlets web.xml


    【解决方案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 上一个答案中得到了很好的解释。

    【讨论】:

    • 请注意,这也在 servlet 规范中进行了说明。我知道更多的人通常不阅读规范,因为它们枯燥且不可读,但 Java Servlet 规范不是这些文档之一:它的可读性很强,并且回答了大多数关于事物应该如何表现的问题。
    • @ChristopherSchulz 感谢您作为 Tomcat 高级专家参与回答。顺便说一句,我刚刚删除了另一个最近关于响应代码 401/501 之间混淆的问题。我对curl 的命令行选项很愚蠢。尝试使用curl -I,其中curl -i 是合适的。重谢。
    • 是的,使用curl -I 将发出HEAD 请求。如果您的 servlet 不支持 doHead,那么您将收到 501 响应。 -i 看起来像你想要的。
    【解决方案2】:

    &lt;url-pattern&gt;/rest1*&lt;/url-pattern&gt; 更改为&lt;url-pattern&gt;/rest1/*&lt;/url-pattern&gt;

    【讨论】:

      猜你喜欢
      • 2011-12-21
      • 2017-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 2015-06-26
      • 2010-10-04
      • 2012-10-03
      相关资源
      最近更新 更多