如何在ViewHelper中用Java在AEM中创建cookie?
我有一个要求,当页面加载时,我必须在服务器端创建cookie。在我们的AEM项目中,我有一个LocatorViewsBofficeHelper.java文件,它映射到组件的JSP(比如locateOffice)。当页面第一次加载onGetData时,将调用LocatorViewsBofficeHelper.java的方法 在这个方法中,我想使用以下代码创建cookie,但我无法创建它。当我在servlet中使用相同的createcookie代码并通过ajax调用调用它时,它成功地创建了cookie如何在ViewHelper中用Java在AEM中创建cookie?,java,jsp,aem,aem-6,Java,Jsp,Aem,Aem 6,我有一个要求,当页面加载时,我必须在服务器端创建cookie。在我们的AEM项目中,我有一个LocatorViewsBofficeHelper.java文件,它映射到组件的JSP(比如locateOffice)。当页面第一次加载onGetData时,将调用LocatorViewsBofficeHelper.java的方法 在这个方法中,我想使用以下代码创建cookie,但我无法创建它。当我在servlet中使用相同的createcookie代码并通过ajax调用调用它时,它成功地创建了cooki
一个可能的原因可能是当页面完全加载时,响应对象不能有cookie。但我无法理解如何管理它 您可能有几个问题 编辑模式 您将不会在编辑器中看到会话cookies,因为您的页面位于iframe中。只需执行“发布时查看”(?wcmmode=disabled)即可直接在浏览器窗口中获取页面 错误响应对象 将LocatorViewsBofficeHelper.java映射到该组件听起来像是有人试图施展魔法。也许您的服务没有得到真正的响应对象,但更多的是响应包装器。您的服务的输出以某种方式被验证并写入真实响应。在这种情况下,http头常常被忽略 只要创建自己真正的AEM组件,内容就由SlingSafeMethodServlet编写(通过资源类型注册)。如果这行得通,你知道该去哪里 以下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);
}
}
@组件(
service=Servlet.class,
属性={
SLING_SERVLET_RESOURCE_TYPES+“=/apps/myproject/components/cookie test”,
SLING\u SERVLET\u方法+“=GET”,
SLING_SERVLET_扩展+“=html”
})
公共类CookietTestServlet扩展了SlingSafeMethodsServlet{
@凌驾
受保护的void doGet(@Nonnull SlingHttpServletRequest请求,@Nonnull SlingHttpServletResponse响应)抛出ServletException,IOException{
PrintWriter out=response.getWriter();
out.println(“Cookie测试”);
Cookie Cookie=新Cookie(“alex”,“this-is-a-test-”+(System.currentTimeMillis()%10000));
addCookie(cookie);
}
}
响应缓冲区已刷新
HttpServletResponse更像一个缓冲写入程序或输出流。只要尚未刷新响应输出缓冲区,就只能添加http头(或cookie)
为了验证这一点,可以在较小的页面上使用测试组件,或者简单地增加OSGi配置缓冲区的大小(例如1MB,但仅在本地实例上)。因此,请转到web控制台/OSGi/Configuration/基于Apache Felix Jetty的Http服务/响应缓冲区大小 () 我不建议在生产中改变它。因此,您应该找到另一种方法,在内容生成的早期。作为最极端的解决方法,您可以使用吊索请求过滤器 选择退出过滤器 如果您的项目使用了Adobe Granite退出服务,那么您可能需要在OSGi配置中将cookie列入白名单。默认情况下,此服务不应执行任何操作 尝试其他选择 作为备选方案,我建议:
- 使用吊索过滤器
- 使用JavaScript创建Cookie前端
AlexAEM 6中的jsp?我是说。。为什么?请不要试图声明你的问题“不是重复的”。你可能错过了一份好的复制件,并且乐于接受复制件是件好事。