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

如何在AEM Servlet中获取请求头中的BundleId值?

解决Sling Servlet无法获取请求头的问题

我来帮你一步步排查并解决这个通过请求头获取BundleId失败的问题,从最常见的原因开始梳理:

1. 首先检查请求头名称是否正确

你代码里的request.getHeader("")传了一个空字符串,这肯定拿不到任何值!先确认其他系统发送请求时,携带BundleId的请求头具体叫什么(比如X-Bundle-Id、Bundle-Id或者就是BundleId),然后把正确的名称填进去,示例代码:

String valueFromHeader = request.getHeader("X-Bundle-Id"); // 替换成实际的请求头名称

2. 排查Dispatcher或Web服务器的请求头过滤

如果你的AEM实例前端配置了Dispatcher(搭配Apache HTTP Server),默认情况下Dispatcher会过滤掉大部分自定义请求头,只保留标准HTTP头。你需要修改dispatcher.any配置文件,把目标请求头加入允许传递的列表:

/clientheaders
{
    "X-Bundle-Id"  // 添加你的自定义请求头名称
    "Host"
    "User-Agent"
    // 其他默认允许的头...
}

同时要确保Apache的mod_headers模块已经启用,避免请求头被Web服务器提前拦截。

3. 检查是否有过滤器拦截/修改了请求头

AEM或Sling中的全局Servlet Filter可能会在请求到达你的BundleServlet之前,移除或修改请求头。你可以在doPost方法开头添加一段日志,打印当前请求所有的请求头,确认目标头是否存在:

Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
    String headerName = headerNames.nextElement();
    System.out.println("Received Header: " + headerName + " = " + request.getHeader(headerName));
}

通过这段日志,你可以明确知道当前请求实际携带了哪些头,排除是否是上游环节丢失了请求头。

4. 处理跨域请求的CORS限制

如果其他系统是跨域调用你的Servlet,浏览器会先发送OPTIONS预检请求,这时候需要确保AEM的CORS配置允许携带自定义请求头:

  • 登录AEM的OSGi控制台(/system/console/configMgr)
  • 找到Apache Sling CORS Filter配置项
  • 在Allowed Headers列表中添加你的自定义请求头名称(比如X-Bundle-Id)
  • 确保Allowed Methods包含POST方法

按这个顺序排查下来,应该能定位到问题所在,先从最基础的请求头名称检查开始,这往往是最容易忽略的点!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:22:05