【问题标题】:Error location always from root of site?错误位置总是来自站点的根目录?
【发布时间】:2011-12-25 18:11:17
【问题描述】:

我的 web.xml 文件中有这个 XML:

<error-page>
    <error-code>404</error-code>
    <location>/error/html/404</location>
</error-page>

如果我转到类似/indexer(不存在)的页面,那么我会被正确重定向到 URL /error/html/404。如果我转到像/index/nope 这样的页面(它也不存在),那么我是一个空白页面,并且 URL 显示为/index/error/html/404。我可以在location 标签中添加什么来始终获得正确的 URL,无论我从哪里开始?

【问题讨论】:

    标签: spring servlets web.xml


    【解决方案1】:

    这不是正常行为。它绝对应该与上下文根相关。我从Servlet 3.0 specification的第154页引用:

    子元素location 元素包含资源在网络中的位置 应用程序相对于 Web 应用程序的根目录。位置的价值 必须有一个前导 ‘/’

    您的问题是由使用的 servletcontainer 中的错误引起的。报告它和/或升级到最新版本。或者,也许你有一个糟糕的FilterERROR 调度程序上拦截/* 的URL 模式,它错误地使用了RequestDispatcher#forward()


    更新 根据 cmets,您使用的是 Tomcat 7.0.16,它是一个与 Servlet 3.0 兼容的容器。尽管您的 web.xml 被声明为符合 Servlet 2.5 而不是 3.0,但我无法在本地 Tomcat 7.0.11、7.0.19 或 7.0.22 上使用 web.xml 版本重现您的问题。此外,浏览器地址栏中的 URL 不会在此处更改(也不应该更改)。只有原始(错误)URL 保留在浏览器地址栏中。这让我认为这更有可能是由错误的过滤器或可能是前端控制器 servlet 引起的,该 servlet 映射到过于通用的 URL 模式 /* 并且正在发送重定向到错误的 URL。在您的 web 应用程序中检查此类过滤器或 servlet,进行相应的调试和修复。

    【讨论】:

    • 如果我理解你所说的正确:我的 XML 没问题,问题是 Spring servlet 容器吗?
    • Spring(除其他外)是一个 DI 框架,而不是一个 servlet 容器。 servletcontainer 是您将 web 应用程序部署到的位置。例如。 Tomcat 7.0.22、Glassfish 3.1.1、JBoss AS 6.0.0 等。了解 servlet 容器的确切品牌/版本将有助于更多地确定问题和/或尝试重现和/或报告问题适当地。告诉您的 web.xml 声明为哪个 Servlet API 版本也很有帮助。
    • 我使用的是 Apache Tomcat 7.0.16,我的 web.xml&lt;web-app version="2.5" ...&gt; 开头。 xsi:schemaLocation 也表示 2.5。
    • 谢谢。我手头没有 7.0.16,但我无法在 7.0.22 或 7.0.11 上重现您的问题,我在这里(也不是在 7.0.19 上)。查看答案更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多