你可能有几个问题。
编辑模式
您不会在编辑器中看到会话 cookie,因为您的页面位于 iframe 中。只需执行“查看已发布”(?wcmmode=disabled) 即可直接在浏览器窗口中获取您的页面。
错误的响应对象
将 LocatorViewESBOfficeHelper.java 映射到组件听起来像是有人试图做一些魔术。也许您的服务没有得到真正的响应对象,而是更多的响应包装器。并且您的服务的输出以某种方式被验证并写入真实响应。在这种情况下,通常会忽略 http 标头。
只需创建您自己真正的 AEM 组件,如果内容是由 SlingSafeMethodsServlet 编写的(通过资源类型注册)。如果这行得通,您就知道该去哪里了。
以下 servlet 确实对我有用:
@Component(
service = Servlet.class,
property = {
SLING_SERVLET_RESOURCE_TYPES + "=/apps/myproject/components/cookie-test",
SLING_SERVLET_METHODS + "=GET",
SLING_SERVLET_EXTENSIONS + "=html"
})
public class CookieTestServlet extends SlingSafeMethodsServlet {
@Override
protected void doGet(@Nonnull SlingHttpServletRequest request, @Nonnull SlingHttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("<h2>Cookie Test</h2>");
Cookie cookie = new Cookie("alex", "this-is-a-test-" + (System.currentTimeMillis() % 10000));
response.addCookie(cookie);
}
}
响应缓冲区已刷新
HttpServletResponse 更像是一个缓冲的Writer 或OutputStream。只要响应输出缓冲区尚未刷新,您就只能添加 http 标头(或 cookie)。
要验证这一点,要么在较小的页面上使用测试组件,要么简单地将 OSGi 配置中的缓冲区增加到真正高的值(例如 1MB - 但仅限于您的本地实例)。因此转到 web 控制台/OSGi/Configuration/
Apache Felix Jetty Based Http Service/Response buffer size
(http://localhost:4502/system/console/configMgr/org.apache.felix.http)
我不建议在生产中更改它。因此,您应该找到另一种方法在内容生成的早期阶段。作为最极端的解决方法,您可以使用 Sling 请求过滤器。
选择退出过滤器
如果您的项目使用 Adobe Granite Opt-Out Service,那么您可能必须在 OSGi 配置中将您的 cookie 列入白名单。默认情况下,此服务不应执行任何操作。
尝试其他选择
作为替代方案,我建议:
- 使用吊索过滤器
- 使用 JavaScript 创建 Cookie 前端
我希望我的一个想法可以为您指明正确的方向。
亚历克斯