Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ViewHelper中用Java在AEM中创建cookie?_Java_Jsp_Aem_Aem 6 - Fatal编程技术网

如何在ViewHelper中用Java在AEM中创建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。在我们的AEM项目中,我有一个LocatorViewsBofficeHelper.java文件,它映射到组件的JSP(比如locateOffice)。当页面第一次加载onGetData时,将调用LocatorViewsBofficeHelper.java的方法

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


一个可能的原因可能是当页面完全加载时,响应对象不能有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前端
我希望我的一个想法能为你指明正确的方向


Alex

AEM 6中的jsp?我是说。。为什么?请不要试图声明你的问题“不是重复的”。你可能错过了一份好的复制件,并且乐于接受复制件是件好事。