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

Jetty配置setSendServerVersion(false)未隐藏Server响应头版本问题求助

Jetty响应头Server字段移除方案

问题根因

你调用setSendServerVersion(false)未生效的核心原因是你创建的HttpConfiguration实例没有绑定到Jetty实际运行使用的ServerConnector中,Jetty默认加载的是自身初始化的默认配置实例,你单独修改的实例并未生效。

解决方案

方案1:正确绑定HttpConfiguration到连接器

修改Jetty启动代码,确保自定义的HttpConfiguration关联到实际使用的连接器,示例代码如下:

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory;

public class JettyServer {
    public static void main(String[] args) throws Exception {
        Server server = new Server();
        // 自定义HTTP配置
        HttpConfiguration httpConfig = new HttpConfiguration();
        httpConfig.setOutputBufferSize(32768);
        // 关闭Server版本输出
        httpConfig.setSendServerVersion(false);
        // 可选:关闭X-Powered-By字段输出
        httpConfig.setSendXPoweredBy(false);
        
        // 将自定义配置绑定到连接器
        ServerConnector httpConnector = new ServerConnector(server, new HttpConnectionFactory(httpConfig));
        httpConnector.setPort(8080);
        server.setConnectors(new ServerConnector[]{httpConnector});
        
        server.start();
        server.join();
    }
}

方案2:新增全局过滤器强制移除Server头

如果方案1不生效或你无法修改Jetty启动配置,可以新增全局过滤器强制清除响应头中的Server字段:

  1. 实现过滤器类
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class RemoveServerHeaderFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        chain.doFilter(request, response);
        // 强制覆盖/移除Server字段
        httpResponse.setHeader("Server", "");
        // 若为Jetty原生响应,可直接调用移除API:
        // ((org.eclipse.jetty.server.Response) response).getHttpFields().remove("Server");
    }
}
  1. 注册过滤器到Jetty上下文
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
// 注册过滤器,匹配所有请求路径
context.addFilter(RemoveServerHeaderFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
server.setHandler(context);

方案3:配置全局系统属性(终极方案)

启动服务时添加JVM启动参数,全局强制关闭Server版本输出,优先级高于代码配置:

-Dorg.eclipse.jetty.server.Response.sendServerVersion=false

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:45:03