我正在使用一些第三方的东西,要求设置响应中的statusText。无论我做什么,都只是""
。我正在使用 Spring 4.3.4和 Spring Boot 1.4.2。
我尝试在控制器方法中将HttpServletResponse
作为参数,然后像这样调用sendError
:
public void foo(@PathVariable String myVar, HttpServletResponse response) throws IOException
{
//... other stuff
response.sendError(200, "OKOKOKOKOK");
}
但是,当实际响应返回浏览器时,响应如下所示:
{"timestamp":1486068130749,"status":200,"error":"OK","message":"OKOKOKOKOK","path":"/my/path"}
状态文本仍为""
。我知道Spring必须在发送回客户端之前生成此响应。我怎么能阻止这个?有没有什么方法可以为statusText设置非空字符串?
答案 0 :(得分:1)
我认为您必须引用Servlet容器发送的HTTP状态行。 从Tomcat 8.5开始,HTTP原因短语不再被写入,因为它不是必需的,HTTP客户端不应该读取:请参阅this Spring Boot issue for more details。
答案 1 :(得分:1)
1.4.2 版本的Spring-boot使用了嵌入式tomcat 8.5.6 ,其中删除了响应文本。因此,您得到的statusText为“”。
最初,原因短语已由 Tomcat-8.5 删除。
但是,后来提供了一个修补程序,以使用 Http连接器中的属性对其进行配置。
您所要做的只是设置sendReasonPhrase="true"
属性,它将像以前一样工作。
使用以下任何一种方法进行配置:
方法1:更新 ... / apache-tomcat-8.5.x / conf / server.xml 以包括以下属性:
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" sendReasonPhrase="true" />
方法2:通过bean配置。 (添加到配置文件中)
@Bean
public EmbeddedServletContainerFactory servletContainerFactory() {
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
factory.addConnectorCustomizers(connector ->
((AbstractProtocol) connector.getProtocolHandler()).setSendReasonPhrase(true));
return factory;
}
注意::此配置将被放置在 Tomcat-9.0 中(即:不会发送响应消息)
参考: