tomcat - 使用 ExceptionMapper 的自定义 HTTP 原因短语

标签 tomcat jax-rs http-status-codes exceptionmapper

我定义了以下异常映射器来处理自定义 HttpCustomException

package com.myapp.apis;

import com.myapp.apis.model.HttpCustomException;
import com.myapp.apis.model.HttpCustomExceptionStatusType;
import com.myapp.apis.model.HttpCustomNotAuthorizedException;

import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class HttpCustomExceptionMapper implements ExceptionMapper <HttpCustomException> {

  @Override
  public Response toResponse (HttpCustomException e) {
    Response response = Response.status (new HttpCustomExceptionStatusType (Response.Status.UNAUTHORIZED, e.getMessage ())).build ();
    if (e instanceof HttpCustomNotAuthorizedException) {
      response = Response.status (new HttpCustomExceptionStatusType (Response.Status.INTERNAL_SERVER_ERROR, e.getMessage ())).build ();
    }

    System.out.println ("HttpCustomExceptionMapper: " + response.getStatus () + ", " + response.getStatusInfo ().getReasonPhrase ());
    return response;
  }
}

当代码中抛出 HttpCustomNotAuthorizedException 时,我可以在 catalina.out 中看到 toResponse 方法末尾定义的日志消息。因此,在请求处理期间将调用 HttpCustomExceptionMapper 类。但是,在最终响应中,我在客户端中看到,我只看到标准的 Not Authorized 消息,而不是我在 Response 中设置的自定义消息。

为什么会这样?

最佳答案

您应该注意,当前版本的 HTTP 协议(protocol) (HTTP/2) 根本不支持原因短语。它已从协议(protocol)中删除。

因此,从 Tomcat 9.0 开始,不再支持发送原因短语。在 Tomcat 7.0 中,8.5 对发送自定义原因短语的支持默认关闭(可以使用 system propertyorg.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER 启用)。在 8.5 中,您还应该在 Connector 上设置 sendReasonPhrase="true" .

关于tomcat - 使用 ExceptionMapper 的自定义 HTTP 原因短语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52821653/

相关文章:

eclipse - 在 tomcat 中构建和部署应用程序期间,Web 应用程序目录和数据丢失

apache - 在 apache 目录外加载图像

java - 将更改应用到 JSP,而无需在 IntelliJ 中重新部署应用程序

java - 返回接口(interface)实例数组

java - 按需控制 Java EE 应用程序的 Jersey 日志记录

java - 是否有一种规范的方法来确定 HTTP 响应是否在 Java 的 200 系列中?

tomcat - 在tomcat上配置虚拟主机

java - 如何将我的注册提供者与动态创建的 Jersey 资源类一起使用?

asp.net - 如何在自定义错误页面中访问 HTTP StatusDescription

rest - 即使请求失败,HTTP 响应也总是返回响应代码 200,并且返回状态代码是 REST 的一部分