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
相关产品推荐
相关产品推荐

