我有一个场景,从AEM的一个页面,我需要在同一个应用程序中调用另一个AEM页面,我需要传递一些隐藏的参数。我选择通过POST进行操作,下面是我遵循的步骤: 从页面" A",我通过POST将表单提交到sling servlet并传递了一些参数。 2.在servlet中,使用请求调度程序,我使用以下代码片段将相同的请求和响应重定向到doPost方法中的不同页面:
request.getRequestDispatcher("/content/company/en/apps/welcomepage.html").forward(request, response);
当我运行代码时,我可以通过表单提交来调用servlet,但是我无法重定向到新页面。我在日志中看到以下错误:
18.10.2017 14:41:00.802 ERROR [127.0.0.1 [1508352060795] POST / bin / rap / welcomepage HTTP / 1.1] org.apache.sling.servlets.post.impl.operations .ModifyOperation响应处理期间的异常。 javax.jcr.nodetype.ConstraintViolationException:没有匹配的属性定义:appointmentTypeId = platform001d 在org.apache.jackrabbit.oak.jcr.delegate.NodeDelegate.setProperty(NodeDelegate.java:522) 在org.apache.jackrabbit.oak.jcr.session.NodeImpl $ 35.perform(NodeImpl.java:1375) 在org.apache.jackrabbit.oak.jcr.session.NodeImpl $ 35.perform(NodeImpl.java:1363) 在org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate.perform(SessionDelegate.java:208) 在org.apache.jackrabbit.oak.jcr.session.ItemImpl.perform(ItemImpl.java:112) 在org.apache.jackrabbit.oak.jcr.session.NodeImpl.internalSetProperty(NodeImpl.java:1363)
如果我在doGet方法中尝试相同的代码,它可以正常工作。此外,如果我使用response.sendRedirect(" /content/company/en/apps/welcomepage.html")它也可以正常工作。但问题是它将它作为对页面的新请求启动它并且它丢失了我从表单提交中获得的所有参数。有人可以告诉我,我怎么能通过POST将请求重定向到AEM中的页面,因为我需要传递一些隐藏的参数,这些参数在网址中不可见?
答案 0 :(得分:1)
以下是我理解您的问题的方式
POST
请求并调用:
request.getRequestDispatcher("/content/company/en/apps/welcomepage.html").forward(request, response);
为什么会出现此异常?
由于您使用的是forward
,POST
请求会转发给/content/company/en/apps/welcomepage.html
该节点最有可能是cq:Page
类型的节点,该节点对可以添加的属性有所限制。可以将其视为试图在cq:Page
节点上存储参数的简单发布请求。
你能做什么?
由于我不了解您的用例,特别是为什么您需要保留提交参数,我不能推荐具体的解决方案。但是,由于您不需要URL中的参数,因此可以尝试以下方法:
response.sendRedirect("/content/company/en/apps/welcomepage.html")
/content/company/en/apps/welcomepage.html
中的任何组件上,您可以获取请求Cookie并根据需要处理它们。同样的方式你想处理那些隐藏的参数。现在流程变为:
POST
请求,将特殊参数添加到响应中的Cookie,然后调用response.sendRedirect("/content/company/en/apps/welcomepage.html")