【问题标题】:How to send servlet response to web.xml configured error page如何将 servlet 响应发送到 web.xml 配置的错误页面
【发布时间】:2016-11-03 14:32:44
【问题描述】:

我正在使用 Tomcat。我在web.xml 中定义了一些<error-page> 并将404 错误映射到页面/error/error.jsp。我需要检测资源是否存在,如果资源不可用,则将响应状态设置为 404。

response.setStatus(404);

但是Tomcat并没有重定向到我定义的404页面,所以我的问题是,有没有API可以获取web.xml中定义的页面位置?我不想自己解析web.xml

【问题讨论】:

  • 或许可以提供更多信息,以便我们自己解决问题。因为知道错误页面可能无济于事。

标签: tomcat servlets custom-error-pages


【解决方案1】:

只需使用HttpServletResponse#sendError()status code。例如

File resource = new File(path, name);
if (!resource.exists()) {
    response.sendError(HttpServletResponse.SC_NOT_FOUND); // Sends 404.
    return;
}

servletcontainer 将显示合适的错误页面。

注意:return 语句不是用来装饰的。它将避免同一方法块中的剩余代码继续运行并可能在应用服务器日志中产生IllegalStateExceptions!初学者通常认为sendRedirect()forward()sendError() 等方法在调用时会以某种方式自动退出方法块。因此,这 不是 真的 ;)

【讨论】:

    【解决方案2】:

    不,没有 API。该设置是 Tomcat 内部的,它不会直接将其暴露给外界。 (正如您所说,您可以解析 web.xml - 因为它是 XML,所以编写 XQuery 将其提取出来会很简单)。

    另外,我认为您似乎对这应该如何工作感到困惑。您向 Tomcat 提供一个 URI,它将用于提供 404 响应的 HTML 正文。它需要能够将此 URI 解析为实际资源,就好像它是在请求中提供的一样。因此,在许多情况下,您不需要 servlet 来检测资源是否存在 - 您需要一个 servlet 来包含要服务的资源。例外情况是,如果您使用 Tomcat 为某些 URL 提供静态文件系统数据,我相信这是可能的,尽管很少使用。

    如果您有一个没有任何 servlet 的 Tomcat 设置,您希望它提供什么服务?您究竟希望它从哪里获得您的error.jsp 页面?你指望它怎么知道?您需要做的是向 Tomcat 添加至少一个 servlet(包含 error.jsp 文件),然后确保 web.xml 将 /error/error.jsp URL 映射到此 servlet(并且资源位于错误子目录中在 servlet 中)。

    完成此操作后,您应该能够手动转到例如http://localhost:8080/<context>/error/error.jsp 并提供响应(可能包含一些奇怪的内容,因为没有实际异常,但应该找到该文件)。同样,如果您在 web.xml 中正确设置了错误页面指令,则转到映射的 URL(例如 http://localhost:8080/<context>/asdfghjasgh)应该会显示您的错误页面作为 404 响应。

    【讨论】:

    • 感谢您的回答,我知道这个问题似乎有点奇怪,我正在设计一个框架,servlet 实际上正在将请求发送到合适的操作。
    猜你喜欢
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    相关资源
    最近更新 更多