Java <;错误页面>;在web.xml中定义的总是返回HTTP状态200

Java <;错误页面>;在web.xml中定义的总是返回HTTP状态200,java,jakarta-ee,error-handling,servlet-3.0,Java,Jakarta Ee,Error Handling,Servlet 3.0,我有一个运行在JBoss7(EAP6.4)上的EE6JAX-RS应用程序,它通过ExceptionMapper的实现在内部处理大部分异常和错误 但是,在某些情况下(最明显的是HTTP Basic Auth失败时),由于错误发生在调用应用程序之前,因此不会调用此错误,因此客户端会获得服务器的默认错误页面(JBWEB bla bla,带有难看的紫色的HTML) 现在为了捕捉这些“外部”错误,我在web.xml中添加了定义,如下所示: <error-page> <locati

我有一个运行在JBoss7(EAP6.4)上的EE6JAX-RS应用程序,它通过
ExceptionMapper
的实现在内部处理大部分异常和错误

但是,在某些情况下(最明显的是HTTP Basic Auth失败时),由于错误发生在调用应用程序之前,因此不会调用此错误,因此客户端会获得服务器的默认错误页面(JBWEB bla bla,带有难看的紫色的HTML)

现在为了捕捉这些“外部”错误,我在
web.xml
中添加了
定义,如下所示:

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

/error.json
401
/error401.json
位置工作正常,我几乎得到了我想要的响应,但HTTP状态码始终为200。


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

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

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

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

401
/错误/401
哪个叫服务

@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();
    }

}
@Path(“/error”)
公共类错误服务{
私有静态最终映射statusMsg;
静止的
{
statusMsg=新HashMap();
statusMsg.put(401,“资源需要身份验证”);
statusMsg.put(403,“拒绝访问”);
statusMsg.put(404,“未找到资源”);
statusMsg.put(500,“内部服务器错误”);
}
@得到
@路径(“{httpStatus}”)
公共响应错误(@PathParam(“httpStatus”)整数httpStatus){
字符串msg=statusMsg.get(httpStatus);
如果(msg==null)
msg=“意外错误”;
抛出新的MyWebApplicationException.Builder()
.状态(httpStatus)
.addError(msg)
.build();
}
}
我有一个exception类
MyWebApplicationException
,它有自己的构建器模式,我以前已经使用该模式使用jax-rs
exceptionapper将各种应用程序错误格式化为JSON


因此,现在我只是通过同一个通道手动输入外部捕获的错误(如JAX-RS之外发生的401错误)。

使用该类的生成器方法来处理错误并返回
响应。或者使用
ExceptionMapper
class。使用错误是什么意思?你是说写一个servlet/JAX-RS端点而不是一个静态json文件?这就是我最后所做的,但感觉有点不对:在没有任何设置的情况下,Jboss返回一个具有正确HTTP状态的HTML。当我在web.xml中指定一个页面时,Jboss会返回该页面(很好),但会将状态代码更改为200(为什么?)。不,我的意思是不是类似于或帮助?遗憾的是,不。我在JAX-RS应用程序中已经有一个ExceptionMapper,它将处理我的代码可能引发的任何异常。不幸的是,HTTP基本身份验证(使用web.xml和安全领域)发生在JAX-RS之外,因此映射程序从未被调用。Jboss'(即EAP)的默认错误页面返回正确的状态代码。如果我没有指定
,登录失败将使我获得HTTP状态为401的紫色JBWEB000065页面。