Jersey 响应的原因短语在 tomcat 7 和 8.5 中不一致

use*_*900 2 java tomcat jersey httpresponsemessage tomcat8.5

我在一台服务器上使用 Tomcat 8.5,在另一台服务器上使用 Tomcat 7,我有以下球衣资源:

@Path("main")
public class MyResource {


@POST
@Path("path")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public PojoResponse sendMailTemplate(PojoRequest paramsMap) throws Exception {
    return service.execute(paramsMap);
}
Run Code Online (Sandbox Code Playgroud)

这是注册到MyApplication( extends ResourceConfig) 与@ApplicationPath("root")

使用 JMeter/Postman(到 /root/main/path)提交请求时,我得到了不一致的 HTTP原因短语

客户端不需要检查或显示原因短语。

这对协议不是强制性的

这里列出的原因短语只是建议——它们可以被本地等效替换而不影响协议。

我从 Tomcat 7 服务器看到 200 OK 的“有效”响应:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/json
Content-Length: 32
Run Code Online (Sandbox Code Playgroud)

以及来自 Tomcat 7 服务器的 200 200 的“无效”响应(相同的请求):

HTTP/1.1 200 200
Server: Apache
Content-Type: application/json
Content-Length: 32
X-Content-Type-Options: nosniff
X-XSS-Protection: 1
Connection: close
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Run Code Online (Sandbox Code Playgroud)

当我检查响应时,我没有找到任何更新原因短语的参考,那么这种不一致应该被忽略还是可以修复?

编辑

我的应用程序还注册了 JacksonFeature:

register(JacksonFeature.class);
Run Code Online (Sandbox Code Playgroud)

编辑 2

实际上我发现我在第二个环境中有额外的 jar:

 jersey-entity-filtering-2.19
Run Code Online (Sandbox Code Playgroud)

常见的罐子:

jersey-client-2.19.jar
jersey-common-2.19.jar
jersey-container-servlet-2.19.jar
jersey-container-servlet-core-2.19.jar
jersey-guava-2.19.jar
jersey-media-jaxb-2.19.jar
jersey-media-json-jackson-2.6.jar
jersey-server-2.19.jar
jersey-spring3-2.6.jar
Run Code Online (Sandbox Code Playgroud)

编辑 3

我在 Tomcat 8.5 中发现了一个错误,其中说原因短语已被删除

Christopher Schultz:我很惊讶地看到 Tomcat 主动删除了原因短语。我最初认为这只是 Tomcat 从 Tomcat 生成的每个响应中删除原因短语(例如来自 DefaultServlet 的所有内容、各种内部错误等),但它正在积极地剥离应用程序明确设置的原因短语。

Michael Osipov:不,这不会发送任何理由短语。只有 HTML 错误页面。我知道,因为我上次重写了 ErrorReportValve。

编辑 4

我找到了相关问题,但我没有完全理解它

Tomcat 8.5 从响应中删除了“HTTP 状态原因短语”,因此您将在响应中获得 HTTP 200 而不是 HTTP 200 OK。您的观察结果可能来自将状态代码复制到状态原因短语中以供显示的软件。

你是如何观察状态码的?您可能会发现,如果进行协议跟踪,您会看到 Tomcat / httpd 只发送了一个状态代码。您确定“双重状态代码”实际上不是(正常)状态代码和恰好与状态代码相同文本的原因短语吗?

Kon*_*nko 5

前两天刚回答了一个类似的问题(52821653)。

简而言之:当前版本的 HTTP 协议 (HTTP/2) 已删除对原因短语的支持。

这个功能没了。不要依赖它。

更新

看着

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Run Code Online (Sandbox Code Playgroud)

HTTP/1.1 200 200
Server: Apache
Run Code Online (Sandbox Code Playgroud)

默认情况下,Tomcat 8.5 当前版本的 HTTP 连接器将响应HTTP/1.1 200(无理由短语)。见org.apache.coyote.http11.Http11OutputBuffer

HTTP/1.1 200 200由于某些 HTTP 服务器的限制,Tomcat 8.5 当前版本的 AJP 连接器默认会响应(使用状态码作为原因短语)。见org.apache.coyote.ajp.AjpProcessor

这两个响应都是有效的。

在 Tomcat 8.5 中可以通过sendReasonPhrase="true"Connector上设置来启用生成“OK”字符串。此选项已弃用。