You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 15:12:13