处理 HTTP 状态码的通用机制

Posted

技术标签:

【中文标题】处理 HTTP 状态码的通用机制【英文标题】:A generic mechanism to deal with HTTP status codes 【发布时间】:2011-09-01 08:14:21 【问题描述】:

我知道您可以在 web.xml 中指定错误页面,如下所示

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

我发现为每个错误代码列出一个页面有点乏味。我想知道在这种情况下最好的常见做法是什么!有没有更好的方法来自动生成这些页面,例如使用 JSP 或 servlet 或通过 Spring 或 Stripes?

【问题讨论】:

【参考方案1】:

如果你在谈论页面本身的生成,你可以将错误代码映射到 jsp 页面,例如

<error-page>
    <error-code>404</error-code>
    <location>/errors.jsp</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/errors.jsp</location>
</error-page>

如果您在谈论映射本身,避免映射所有错误代码的可能解决方案(尽管我建议您使用标准 web.xml 映射)是使用过滤所有资源的 servlet 过滤器,委托对 FilterChain 的访问并检查响应代码集是否不是 200(或任何其他预定义的可接受响应,例如 401),然后重定向到 errors.jsp 页面。

为了捕获响应代码,您将使用保存响应代码集的 HttpServletResponseWrapper 实现来包装 HttpServletResponse。

【讨论】:

要访问响应的状态码,我会使用***.com/questions/1302072/…(这是您的建议,但有详细的实现)。【参考方案2】:

Stripe 提供了一些可扩展但简单的异常处理方法。 on the stripes website 有一篇很好的文章,Stripes book 中有几页关于它的文章。

您基本上要么实现 ExceptionHandler 接口,从 DefaultExceptionHandler 扩展(我们通常会这样做),要么有 DelegatingExceptionHandler 用于更高级的情况。

【讨论】:

这仅涵盖 HTTP 500 错误。其他 5nn 和所有 4nn 错误本身不是由异常引起的。 我认为这是相关的,因为 OP 询问了除 404 之外的错误代码。这实际上将涵盖大多数 404,因为 Stripes 拦截器尝试绑定大多数 URL 并在动作 bean 时抛出它自己的 404, jsp,或者找不到静态资源。

以上是关于处理 HTTP 状态码的通用机制的主要内容,如果未能解决你的问题,请参考以下文章

HTTP各个状态码的含义

常用状态码

HTTP状态码

读书笔记 | 《图解HTTP》第四章 返回结果的 HTTP 状态码

返回结果的HTTP状态码

HTTP中的状态码√★