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

Spring Boot:如何绕过客户端无效Accept请求头问题?

Prometheus与Spring Boot Actuator 406错误临时绕过方案

针对近期Prometheus版本抓取Spring Boot Actuator的/actuator/prometheus接口时,因Accept请求头携带无效q=2值导致Spring Boot返回406 Not Acceptable的问题,以下是几种可行的临时绕过方案:

方案1:自定义Servlet Filter修正请求头

在Spring Boot应用中添加自定义Filter,拦截请求并修正包含无效q=2的Accept头,将其替换为合法的权重值(如q=1.0):

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletRequestWrapper;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

@Component
public class FixAcceptHeaderFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String acceptHeader = httpRequest.getHeader("Accept");

        if (acceptHeader != null && acceptHeader.contains("q=2")) {
            // 替换无效的q=2为合法的q=1.0
            String fixedAcceptHeader = acceptHeader.replace("q=2", "q=1.0");
            HttpServletRequestWrapper wrappedRequest = new HttpServletRequestWrapper(httpRequest) {
                @Override
                public String getHeader(String name) {
                    if ("Accept".equalsIgnoreCase(name)) {
                        return fixedAcceptHeader;
                    }
                    return super.getHeader(name);
                }

                @Override
                public Enumeration<String> getHeaders(String name) {
                    if ("Accept".equalsIgnoreCase(name)) {
                        return Collections.enumeration(Collections.singletonList(fixedAcceptHeader));
                    }
                    return super.getHeaders(name);
                }
            };
            chain.doFilter(wrappedRequest, response);
        } else {
            chain.doFilter(request, response);
        }
    }
}

该Filter会自动处理所有进入应用的请求,修正有问题的Accept头,无需修改Prometheus配置。

方案2:修改Prometheus抓取配置,指定合法Accept头

在Prometheus的prometheus.yml配置文件中,为对应的Spring Boot监控job添加自定义请求头,覆盖默认的Accept值:

scrape_configs:
  - job_name: 'spring-boot-actuator'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['your-spring-boot-app:8080']
    headers:
      Accept: 'text/plain;version=0.0.4'

通过手动指定合法的Accept头,避免Prometheus自动生成包含q=2的无效请求头,直接绕过解析问题。

方案3:降级Prometheus至无bug版本

如果上述方案无法实施,可以将Prometheus降级到该bug出现之前的稳定版本(如v2.47.0及更早版本),等待上游官方修复后再升级。

内容的提问来源于stack exchange,提问作者Raman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 19:28:16