【问题标题】:How to create cookies in AEM in Java in ViewHelper?如何在 ViewHelper 中的 Java 中的 AEM 中创建 cookie?
【发布时间】:2019-07-31 12:05:50
【问题描述】:

我有一个要求,我必须在页面加载时在服务器端创建一个 cookie。在我们的 AEM 项目中,我有一个 LocatorViewESBOfficeHelper.java 文件,该文件映射到组件的 JSP(比如 locateOffice)。当页面第一次加载时,LocatorViewESBOfficeHelper.java 的 onGetData 方法被调用。

在这种方法中,我想使用以下代码创建 cookie,但我无法创建它。当我在 servlet 中使用相同的创建 cookie 代码并通过 ajax 调用调用它时,它成功创建了 cookie。

一个可能的原因是当页面完全加载时,响应对象可能没有 cookie。但我无法理解如何管理它。

【问题讨论】:

  • AEM 6 中的 jsp?我的意思是..为什么?
  • 请不要试图将您的问题声明为“不重复”。您可能错过了一份好的副本,很高兴收到一份。

标签: java jsp aem aem-6


【解决方案1】:

你可能有几个问题。

编辑模式

您不会在编辑器中看到会话 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 更像是一个缓冲的WriterOutputStream。只要响应输出缓冲区尚未刷新,您就只能添加 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 前端

我希望我的一个想法可以为您指明正确的方向。

亚历克斯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多