我在一台服务器上使用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); }
向MyApplication(extends ResourceConfig)注册@ApplicationPath("root")
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
以及来自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
当我检查“ 响应”时,没有找到对更新原因短语的任何引用,那么是否应该忽略这种矛盾或可以解决这种矛盾?
编辑
我的应用程序还注册了JacksonFeature:
register(JacksonFeature.class);
编辑2
实际上,我发现我在第二个环境中有额外的jar:
jersey-entity-filtering-2.19
普通jar:
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
编辑3
我在Tomcat 8.5中发现一个错误,该错误说原因短语 已删除
克里斯托弗·舒尔茨(Christopher Schultz):我很惊讶地看到Tomcat主动删除了原因短语。我最初以为这只是Tomcat从Tomcat生成的每个响应中删除原因短语(例如,来自DefaultServlet的所有内容,各种内部错误等),但是它正在主动剥离由应用程序明确设置的原因短语。 迈克尔·奥西波夫(Michael Osipov):不,这不发送任何原因短语。仅HTML错误页面。我知道,因为我上次重写了ErrorReportValve。
克里斯托弗·舒尔茨(Christopher Schultz):我很惊讶地看到Tomcat主动删除了原因短语。我最初以为这只是Tomcat从Tomcat生成的每个响应中删除原因短语(例如,来自DefaultServlet的所有内容,各种内部错误等),但是它正在主动剥离由应用程序明确设置的原因短语。
迈克尔·奥西波夫(Michael Osipov):不,这不发送任何原因短语。仅HTML错误页面。我知道,因为我上次重写了ErrorReportValve。
编辑4
我发现了相关问题,但并没有完全理解
Tomcat 8.5从响应中删除了“ HTTP状态原因短语”,因此您将在响应中获得HTTP 200而不是HTTP 200 OK。您的观察结果很可能来自将状态代码复制到状态原因短语以进行显示的软件中。 您如何观察状态码?您可能会发现,如果执行协议跟踪,将会看到Tomcat / httpd仅发送一个状态代码。您确定“双重状态代码”实际上不是(正常)状态代码,并且原因短语恰好与状态代码相同吗?
Tomcat 8.5从响应中删除了“ HTTP状态原因短语”,因此您将在响应中获得HTTP 200而不是HTTP 200 OK。您的观察结果很可能来自将状态代码复制到状态原因短语以进行显示的软件中。
您如何观察状态码?您可能会发现,如果执行协议跟踪,将会看到Tomcat / httpd仅发送一个状态代码。您确定“双重状态代码”实际上不是(正常)状态代码,并且原因短语恰好与状态代码相同吗?
简而言之:当前版本的HTTP协议(HTTP / 2)删除了对原因短语的支持。
此功能已消失。不要依赖它。
更新 :
看着
HTTP/1.1 200 OK Server: Apache-Coyote/1.1
和
HTTP/1.1 200 200 Server: Apache
默认情况下,当前版本的Tomcat 8.5的HTTP连接器将以HTTP/1.1 200(无理由)响应。请参阅org.apache.coyote.http11.Http11OutputBuffer。
HTTP/1.1 200
org.apache.coyote.http11.Http11OutputBuffer
HTTP/1.1 200 200由于某些HTTP服务器的限制,默认情况下,当前版本的Tomcat 8.5的AJP连接器将以(使用状态码作为原因短语)响应。请参阅org.apache.coyote.ajp.AjpProcessor。
HTTP/1.1 200 200
org.apache.coyote.ajp.AjpProcessor
这两个响应都是有效的。
通过sendReasonPhrase="true"在Connector上进行设置,可以在Tomcat 8.5中启用生成“ OK”字符串的功能。不建议使用此选项。
sendReasonPhrase="true"