web.xml中定义的<error-page>始终以HTTP状态200返回

时间:2016-05-23 12:36:30

标签: java java-ee error-handling servlet-3.0

我有一个在Jboss 7(EAP 6.4)上运行的EE6 JAX-RS应用程序,并通过ExceptionMapper的实现在内部处理大多数异常和错误。

但是,有些情况(最明显的是当HTTP Basic Auth失败时)没有调用,因为错误发生在调用应用程序之前,因此客户端获取服务器的默认错误页面(JBWEB bla bla,HTML with丑陋的紫色)。

现在为了捕捉这些“外部”错误,我将<error-page>定义添加到web.xml,如下所示:

<error-page>
    <location>/error.json</location>
</error-page>
<error-page>
    <error-code>401</error-code>
    <location>/error401.json</location>
</error-page>

该位置正常,我几乎获得我想要的响应但HTTP状态代码始终为200.

至少可以说这很烦人。如何让错误页面返回正确的错误代码?

2 个答案:

答案 0 :(得分:1)

我最终得到的是编写一个小型Web服务(而不是静态页面),它会给我一个JSON响应和正确的HTTP状态代码,以及相关的标题:

<error-page>
    <error-code>401</error-code>
    <location>/error/401</location>
</error-page>

调用服务

@Path("/error")
public class ErrorService {

    private static final Map<Integer, String> statusMsg;
    static
    {
        statusMsg = new HashMap<Integer, String>();
        statusMsg.put(401, "Resource requires authentication");
        statusMsg.put(403, "Access denied");
        statusMsg.put(404, "Resource not found");
        statusMsg.put(500, "Internal server error");
    }

    @GET
    @Path("{httpStatus}")
    public Response error(@PathParam("httpStatus") Integer httpStatus) {

        String msg = statusMsg.get(httpStatus);
        if (msg == null)
            msg = "Unexpected error";

        throw new MyWebApplicationException.Builder()
            .status(httpStatus)
            .addError(msg)
            .build();
    }

}

我有一个异常类MyWebApplicationException,它有自己的构建器模式,我之前已经使用jax-rs ExceptionMapper将所有类型的应用程序错误格式化为JSON。

所以现在我只是通过同一个频道手动提供外部捕获的错误(比如在JAX-RS之外发生的401)。

答案 1 :(得分:0)

错误页面机制的目的是向最终用户显示人类可读的内容。如果它返回一些除200之外的代码,它将由浏览器以常见方式处理(浏览器的标准错误消息)。