Jetty 8集成ActiveMQ Classic:隐藏HTTP响应中的Jetty版本
解决ActiveMQ 5.11.3集成Jetty 8.1.16隐藏HTTP响应Server版本的问题
方案一:正确调用Jetty Server的setSendServerVersion方法
Jetty 8.1.16的org.eclipse.jetty.server.Server确实提供了setSendServerVersion(boolean)方法,但直接给bean加属性会失败——因为这是通过setter方法生效的,不是直接的JavaBean属性。需要用Jetty XML的<call>标签来调用:
- 打开ActiveMQ安装目录下的
conf/jetty.xml,找到id为"Server"的bean定义。 - 在bean内部现有配置后添加以下代码块:
<bean id="Server" class="org.eclipse.jetty.server.Server"> <!-- 保留原有线程池、连接器等配置 --> <call name="setSendServerVersion"> <argument type="boolean">false</argument> </call> </bean>
- 重启ActiveMQ,检查HTTP响应头,
Server字段会被隐藏或仅显示通用标识。
如果此方案仍导致Broker启动失败,大概率是ActiveMQ对Jetty Server做了封装,此时可以尝试方案二。
方案二:通过自定义Filter强制覆盖Server响应头
这种方法不依赖Jetty核心配置,通过Servlet Filter直接修改响应头,兼容性更强:
步骤1:编写自定义Filter类
实现javax.servlet.Filter接口,强制清空或替换Server头:
public class HideServerVersionFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse httpResponse = (HttpServletResponse) response; // 可设置为空字符串,或自定义标识(比如"ActiveMQ Console") httpResponse.setHeader("Server", ""); chain.doFilter(request, response); } @Override public void destroy() {} }
步骤2:打包部署Filter
- 将编译后的类打包成JAR,放到ActiveMQ安装目录的
lib/文件夹下。 - 打开
webapps/admin/WEB-INF/web.xml,在现有filter配置前添加:
<filter> <filter-name>HideServerVersionFilter</filter-name> <filter-class>com.yourpackage.HideServerVersionFilter</filter-class> </filter> <filter-mapping> <filter-name>HideServerVersionFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
(替换com.yourpackage为实际包名)
步骤3:验证效果
重启ActiveMQ后,用curl或浏览器访问控制台,检查响应头的Server字段已被修改或清空。
为什么之前的配置失败?
Jetty 8的sendServerVersion不是直接Bean属性,无法通过<property>标签设置,必须用<call>调用setter方法。另外,ActiveMQ对Jetty Server的封装可能导致直接修改Server bean触发兼容性问题,Filter方案是更稳妥的替代方案。
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

