Tomcat日志出现HTTP响应头无效警告,该如何处理?
Tomcat响应头非法字符警告的处理方案
问题背景
日志中出现以下警告:
WARN 1208786 --- [http-nio-8080-exec-2] o.apache.coyote.http11.Http11Processor : The HTTP response header [Saved-url] with value [https://example.com/jobs/1234/сценарист-для-youtube-каналу] has been removed from the response because it is invalid java.lang.IllegalArgumentException: The Unicode character [с] at code point [1,089] cannot be encoded as it is outside the permitted range of 0 to 255 at org.apache.tomcat.util.buf.MessageBytes.toBytesSimple(MessageBytes.java:286) ~[tomcat-embed-core-10.1.11.jar!/:na] at org.apache.tomcat.util.buf.MessageBytes.toBytes(MessageBytes.java:259) ~[tomcat-embed-core-10.1.11.jar!/:na] at org.apache.coyote.http11.Http11OutputBuffer.write(Http11OutputBuffer.java:389) ~[tomcat-embed-core-10.1.11.jar!/:na] at org.apache.coyote.http11.Http11OutputBuffer.sendHeader(Http11OutputBuffer.java:368) ~[tomcat-embed-core-10.1.11.jar!/:na] at org.apache.coyote.http11.Http11Processor.prepareResponse(Http11Processor.java:1051) ~[tomcat-embed-core-10.1.11.jar!/:na] at org.apache.coyote.AbstractProcessor.action(AbstractProcessor.java:376) ~[tomcat-embed-core-10.1.11.jar!/:na] at org.apache.coyote.Response.action(Response.java:210) ~[tomcat-embed-core-10.1.11.jar!/:na] at org.apache.coyote.Response.sendHeaders(Response.java:444) ~[tomcat-embed-core-10.1.11.jar!/:na] at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:287) ~[tomcat-embed-core-10.1.11.jar!/:na] at org.apache.catalina.connector.OutputBuffer.close(OutputBuffer.java:246) ~[tomcat-embed-core-10.1.11.jar!/:na] at org.apache.catalina.connector.Response.finishResponse(Response.java:413) ~[tomcat-embed-core-10.1.11.jar!/:na] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:370) ~[tomcat-embed-core-10.1.11.jar!/:na] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) ~[tomcat-embed-core-10.1.11.jar!/:na] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.11.jar!/:na] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:894) ~[tomcat-embed-core-10.1.11.jar!/:na] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1740) ~[tomcat-embed-core-10.1.11.jar!/:na] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.11.jar!/:na] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.11.jar!/:na] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.11.jar!/:na] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-10.1.11.jar!/:na]
疑问:该警告是否需要引起重视?如果需要,应如何正确配置Spring Boot/Tomcat来解决此问题?
是否需要重视
需要重视,原因如下:
- Tomcat主动移除了
Saved-url响应头,依赖该头的客户端逻辑(比如页面跳转、状态回退)会直接失效,影响业务功能 - 问题源于非ASCII字符(此处为西里尔字母)未被正确处理,说明系统在多语言URL场景下存在编码兼容性漏洞,长期可能引发更多类似问题
解决配置方案
Tomcat 8.5+默认严格遵循HTTP/1.1规范,仅允许响应头包含0-255范围内的ASCII字符。要支持非ASCII字符的响应头,可通过以下两种方式配置:
1. 配置文件方式(推荐,精准控制)
在application.properties中添加:
# 针对特定响应头放宽ASCII校验 server.tomcat.relaxed-response-headers=Saved-url # 设置响应头编码为UTF-8,支持非ASCII字符 server.tomcat.http-header-charset=UTF-8
或application.yaml格式:
server: tomcat: relaxed-response-headers: Saved-url http-header-charset: UTF-8
2. 自定义Tomcat Connector(全局放宽,谨慎使用)
如果需要对所有响应头放开校验(不推荐,可能违反HTTP规范),可编写配置类:
import org.apache.catalina.connector.Connector; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TomcatCustomConfig { @Bean public TomcatServletWebServerFactory tomcatFactory() { TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(); factory.addConnectorCustomizers((Connector connector) -> { // 全局放宽响应头校验 connector.setAttribute("relaxedResponseHeaders", "true"); // 指定响应头编码 connector.setAttribute("httpHeaderCharset", "UTF-8"); }); return factory; } }
最佳实践建议
- 优先对业务代码中设置
Saved-url的逻辑进行改造,提前对URL中的非ASCII字符做URL编码(转换为%XX格式),既符合HTTP规范,又能被客户端正确解码 - 尽量避免全局放宽校验,仅针对需要的响应头单独配置,降低规范兼容性风险
内容的提问来源于stack exchange,提问作者alexanoid
相关产品推荐
相关产品推荐

