无法使用吊销servlet中的请求调度程序通过POST

时间:2017-10-18 18:43:39

标签: java servlets aem sling

我有一个场景,从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中的页面,因为我需要传递一些隐藏的参数,这些参数在网址中不可见?

1 个答案:

答案 0 :(得分:1)

以下是我理解您的问题的方式

  1. 用户访问页面“A”
  2. 用户填写表格,然后提交。
  3. 您的自定义servlet处理提交的POST请求并调用: request.getRequestDispatcher("/content/company/en/apps/welcomepage.html").forward(request, response);
  4. 您获得ConstraintViolationException
  5. 为什么会出现此异常?

    由于您使用的是forwardPOST请求会转发给/content/company/en/apps/welcomepage.html该节点最有可能是cq:Page类型的节点,该节点对可以添加的属性有所限制。可以将其视为试图在cq:Page节点上存储参数的简单发布请求。

    你能做什么?

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

    1. 在您的servlet处理程序中,查看响应中Cookie的隐藏参数。
    2. 使用response.sendRedirect("/content/company/en/apps/welcomepage.html")
    3. /content/company/en/apps/welcomepage.html中的任何组件上,您可以获取请求Cookie并根据需要处理它们。同样的方式你想处理那些隐藏的参数。
    4. 现在流程变为:

      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中获取参数,然后返回相应的响应。