当前位置: 首页 > 面试题库 >

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

狄玉书
2023-03-14
问题内容

我在一台服务器上使用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);
}

MyApplicationextends 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。

编辑4

我发现了相关问题,但并没有完全理解

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 200由于某些HTTP服务器的限制,默认情况下,当前版本的Tomcat
8.5的AJP连接器将以(使用状态码作为原因短语)响应。请参阅org.apache.coyote.ajp.AjpProcessor

这两个响应都是有效的。

通过sendReasonPhrase="true"在Connector上进行设置,可以在Tomcat
8.5中启用生成“ OK”字符串的功能。不建议使用此选项。



 类似资料:
  • 我正在开发一个简单的应用程序,它使用泽西作为框架来构建API,并使用Jackson来处理JSON。 当我部署应用程序时,通过复制 我很确定这个问题不在java代码中,因为它曾经与*一起工作。jar包含方法。但我厌倦了这一点,希望将其迁移到maven体系结构。 我不会发布我的全部代码,但你可以在这里看到。 为了简化操作,下面列出了我使用的依赖项: jersey json v1.19 什么会导致此错误

  • 在Jersey中,可以添加或 两者都是使用PackagesResourceConfig添加的: 谢谢

  • 主要活动: 我的适配器: 和我的接口: POJO: } 示例JSON: {“post_path”: “/nn4cejmhjhbjbsp3vvvhtnwlgqg.jpg”,

  • 问题是,尽管在调用FeedReturnStreamingOutput之前从资源发回响应,但Jersey客户端会等待FeedReturnStreamingOutput执行完成。 客户端代码:

  • 我正在使用restlet框架制作REST web服务。我正在使用组织。restlet 2.3.1 jar 我必须自定义错误响应头。根据具体问题,我必须在响应标题中显示响应状态代码和状态原因。为此,我创建了一个扩展StatusService并重写toStatus方法的类。我检查可丢弃项并相应地设置状态。请参阅下面的示例代码。 因此,无论何时从restlet代码中抛出异常,都会在此处捕获并返回错误响应

  • 因为它创建了一个新的资源,所以如果它返回状态代码201是合适的,但目前它返回200。 我发现如何设置状态代码的唯一方法是让方法返回一个并在那里设置它,但我确实不希望我的所有接口返回一个泛型响应,而不是实际的响应对象(在本例中是)。

  • 我正在尝试使用c#httpClient以编程方式从网站获取数据,但我无法获取数据。我提供了下面的链接https://ngodarpan.gov.in/index.php/home/statewise_ngo/5972/33/1 将有一个以表格格式显示的数据列表,如果单击任何链接,将出现一个弹出窗口,其中包含完整的详细信息,我需要通过编程为每个记录获取这些详细信息。 我已尝试通过点击以下链接每次生成

  • 我正在使用spring boot和jersey(我使用过spring-boot-starter-jersey)开发网关api。我应该同时返回xml和json响应,它似乎可以使用json响应,但当对xml发出请求时,我得到404。这是服务的代码 谢谢你帮了我很多忙。 向sajid致意