【问题标题】:Unable to redirect to another page in AEM using request dispatcher in sling servlet via POST无法使用 sling servlet 中的请求调度程序通过 POST 重定向到 AEM 中的另一个页面
【发布时间】:2017-10-18 18:43:38
【问题描述】:

我有一个场景,我需要从 AEM 中的一个页面调用同一应用程序中的另一个 AEM 页面,并且我需要传递一些隐藏参数。我选择通过 POST 来完成,以下是我遵循的步骤: 从页面“A”开始,我通过 POST 向 sling servlet 提交了表单并传递了一些参数。 2. 在 servlet 中,使用请求调度程序,我使用以下代码 sn-p 将相同的请求和响应重定向到 doPost 方法中的不同页面:

          request.getRequestDispatcher("/content/company/en/apps/welcomepage.html").forward(request, response);

当我运行代码时,我可以通过表单提交调用 servlet,但我无法重定向到新页面。我在日志中看到以下错误:

18.10.2017 14:41:00.802 错误 [127.0.0.1 [1508352060795] POST /bin/rap/welcomepage HTTP/1.1] org.apache.sling.servlets.post.impl.operations .ModifyOperation 响应处理期间出现异常。 javax.jcr.nodetype.ConstraintViolationException:没有匹配的属性定义:约会类型 ID = 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 中的页面,因为我需要传递一些在 url 中不可见的隐藏参数?

【问题讨论】:

  • 当您转发帖子时,它会调用 slingPostServlet 尝试修改该资源并失败。这就是为什么你得到那个例外。

标签: java servlets aem sling


【解决方案1】:

我是这样理解你的问题的

  1. 用户访问页面“A”
  2. 用户填写表单,然后提交。
  3. 您的自定义 servlet 处理提交的 POST 请求并调用: request.getRequestDispatcher("/content/company/en/apps/welcomepage.html").forward(request, response);
  4. 您会收到 ConstraintViolationException

为什么会出现此异常?

由于您使用的是forward,因此POST 请求被转发到/content/company/en/apps/welcomepage.html,该节点很可能是cq:Page 类型,它对可以添加的属性有限制。可以把它想象成一个简单的 post 请求,试图在 cq:Page 节点上存储参数。

你能做什么?

由于我不了解您的用例,尤其是为什么您需要保留提交参数,因此我无法推荐具体的解决方案。但是,由于您不需要 URL 中的参数,因此您可以尝试以下潜在解决方案:

  1. 在您的 servlet 处理程序中,查看响应中那些隐藏的 cookie 参数。
  2. 使用response.sendRedirect("/content/company/en/apps/welcomepage.html")
  3. /content/company/en/apps/welcomepage.html 中的任何组件上,您都可以获取请求cookie 并按您喜欢的方式处理它们。处理那些隐藏参数的方式相同。

现在流程变成:

  1. 用户访问页面“A”
  2. 用户填写表单,然后提交。
  3. 您的自定义 servlet 处理提交的 POST 请求,将您的特殊参数添加到响应的 cookie 中,然后调用 response.sendRedirect("/content/company/en/apps/welcomepage.html")
  4. 用户的浏览器收到带有 cookie 的 301 响应,在浏览器中设置 cookie 然后请求“/content/company/en/apps/welcomepage.html”
  5. 您的组件处理请求并从 cookie 中获取参数,然后返回适当的响应。

【讨论】:

  • 感谢您的回复!!我需要捕获 req 参数,并且需要将参数发送到下游系统。我发现了另一篇具有类似方法的文章:suryakand-shinde.blogspot.in/2016/07/… 我刚刚将“.external”选择器添加到拦截 POST 请求并将其作为 GET 请求发送的 html 页面。但是问题是,一旦我将其重定向到新页面,该页面就会一次又一次地加载。我只是想知道为什么我会看到这个问题?
  • 我没有完全关注。无论如何,这不在您最初的问题中。请更新您的问题,提供更清晰的描述、您尝试过的事情以及您的最终目标,以便我提供帮助。
猜你喜欢
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多