0

我正在尝试将应用程序加载到我的本地 tomcat 实例。当我在启动 tomcat 后将地址输入到 URL 栏中时,即使资源在那里,我也会收到 404-not found 错误。我做了很多试验和错误,在 DD 文件中发现了一些东西。部署描述符的一部分包含以下代码..

<servlet>
    <servlet-name>invoker</servlet-name>
    <servlet-class>
        org.apache.catalina.servlets.InvokerServlet
    </servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>invoker</servlet-name>
    <url-pattern>/servlet/*</url-pattern>
</servlet-mapping>

当我从 web.xml 文件中评论这部分时,我能够成功地从浏览器获取资源。所以我很确定问题出在这段代码中,但我不明白它是什么。有人可以解释一下这段代码在做什么,为什么我会出错。?提前致谢。

编辑:为了记录,我试图直接访问根文件夹下的资源。.. http://localhost/myapp/index.jsp

4

1 回答 1

0

那是旧InvokerServlet版本的 Apache Tomcat 中存在的遗留 Tomcat 特有的(并且仍然在糟糕和过时的教程/书籍中提到)。在黑暗时代,无需映射它们就可以调用 servlet web.xml。您只需在/servlet路径后面的 URL 中输入完全限定的 servlet 类名。

后来证实这是一个安全漏洞,容易受到攻击。它在 2002 年左右在 Tomcat 5.0 上被禁用和弃用(!),并在 2009 年左右在 Tomcat 7.0 中被删除。

您可以安全地删除它。它没有增加绝对的价值。从 Tomcat 7.0 / Servlet 3.0 开始,您甚至不再需要映射 servlet web.xml。您可以改用@WebServlet注释。

package com.example;

@WebServlet(urlPatterns = { "/MyServlet" })
public class MyServlet extends HttpServlet {

    // ...

}

至于删除后它为什么起作用的具体问题,您可能使用了错误的 URL。也许你也调用了你的上下文根路径servlet

于 2011-03-22T20:57:02.570 回答