【问题标题】:CQ5: 403 Forbidden occurs when call a Post servletCQ5:调用 Post servlet 时出现 403 Forbidden
【发布时间】:2014-05-13 00:03:50
【问题描述】:

您好,我正在使用此代码为我的 CQ5 示例应用程序创建 Post 方法。

package com.adobe.cq.sling;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.rmi.ServerException;
import java.util.Dictionary;

import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
import org.apache.sling.commons.osgi.OsgiUtil;
import org.apache.sling.jcr.api.SlingRepository;
import org.apache.felix.scr.annotations.Reference;
import org.osgi.service.component.ComponentContext;
import javax.jcr.Session;
import javax.jcr.Node; 
import org.json.simple.JSONObject;
import java.util.UUID;

@SlingServlet(paths="/bin/mySearchServlet", methods = "POST", metatype=true)
public class HandleClaim extends org.apache.sling.api.servlets.SlingAllMethodsServlet {
     private static final long serialVersionUID = 2598426539166789515L;


     @Override
     protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServerException, IOException {

      try
      {
         //Get the submitted form data that is sent from the
              //CQ web page  
          String id = UUID.randomUUID().toString();
          String firstName = request.getParameter("firstName");
          String lastName = request.getParameter("lastName");
          String address = request.getParameter("address");
          String cat = request.getParameter("cat");
          String state = request.getParameter("state");
          String details = request.getParameter("details");
          String date = request.getParameter("date"); 
          String city = request.getParameter("city"); 

          //Encode the submitted form data to JSON
          JSONObject obj=new JSONObject();
          obj.put("id",id);
          obj.put("firstname",firstName);
          obj.put("lastname",lastName);
          obj.put("address",address);
          obj.put("cat",cat);
          obj.put("state",state);
          obj.put("details",details);
          obj.put("date",date);
          obj.put("city",city);

             //Get the JSON formatted data    
          String jsonData = obj.toJSONString();

             //Return the JSON formatted data
         response.getWriter().write(jsonData);
      }
      catch(Exception e)
      {
          e.printStackTrace();
      }
    }
}

它适用于 GET 请求。但是对于 POST(doPost) 请求,我收到了一条消息:403 Forbidden。我应该怎么做才能解决这个问题?

【问题讨论】:

  • 这应该可以完美运行。并且它应该在使用 GET 请求时抛出 405 GET not supported 错误,因为你还没有实现它。对于 POST,它应该可以工作。您是通过网络服务器访问它吗?如果您通过网络服务器访问,您是否检查过路径 /bin 是否允许访问?
  • 你有没有设法解决这个问题?我有完全相同的问题,似乎无法弄清楚问题是什么

标签: java servlets post aem sling


【解决方案1】:

如果您从内部客户端调用该方法(例如:位于您的应用程序中的 jsp 文件、ajax 或 Servlet),则永远不会发生此问题。但是,如果您从外部客户端(另一个网站或 REST 客户端插件...)调用它,将触发 CQ 安全过滤器以阻止您的操作,然后返回 403 错误以删除它,请按照以下步骤操作:

1/http://localhost:4502/system/console/configMgr
2/ 搜索“Apache Sling 推荐人过滤器”
3/ 从过滤器中删除 POST 方法。然后你可以在任何地方调用你的 POST 方法。

【讨论】:

  • 我这样做了,但是以某种方式从引荐来源过滤器中删除 POST 并没有持续存在。每次我重新启动 AEM 时,它都会重置并在列表中添加 POST。有什么办法解决吗?
  • 知道了,傻小姐。我在删除了 POST 方法的代码中检查了我的配置。它奏效了。
  • 你只需要在html头标签之间添加。或使用 aem 中的 jquery
【解决方案2】:

http://sling.apache.org/documentation/the-sling-engine/servlets.html 所述,使用sling.servlet.paths 属性的servlet 可能会被忽略,除非其路径包含在SlingServletResolver 服务的执行路径(servletresolver.paths) 配置设置中。您应该在 /system/console/configMgr/org.apache.sling.servlets.resolver.SlingServletResolver 找到该配置。

在您的情况下,我认为 /bin/mySearchServlet 路径未包含在该配置参数中,并导致 CQ 返回 403 状态。如果这是正确的,您可以在那里添加您的路径(假设您了解安全隐患)或将您的 servlet 安装在其中配置的路径之一上。

请注意,如果可能,最好避免在路径上安装 servlet,如该文档页面所述,首选在所需路径上创建资源。

【讨论】:

  • /bin/ 默认情况下在解析器配置中可用,不是吗?所以,它应该默认处理这个问题。如果我错了,请纠正我。顺便说一句,我已经在我的实例上检查了这段代码,它工作正常,没有任何额外的配置。
  • Tien Nguyen 没有指出系统是否有默认配置,因此值得检查。但是你是对的,如果 /bin 包含在我提到的配置中,servlet 应该适用于 POST 请求。
【解决方案3】:

除了其他答案之外,如果您使用的是 AEM 6.1,则此问题也可能是由 CSRF 配置引起的,如 this post 中所述。

简短回答,检查 POST 方法是否不在 CSRF 过滤器配置的过滤器方法中

http://localhost:4502/system/console/configMgr/com.adobe.granite.csrf.impl.CSRFFilter

【讨论】:

    【解决方案4】:

    我也在使用相同的代码来满足类似的要求,但我遇到了这个错误。 我已经解决了。

    PFB 步骤。它们中的任何一个/全部都可能对您有用。

    1. 然而,我使用了不同的注释。

      @组件( 立即=真,元类型=真,标签=“立即参与表格”, 描述 =“立即参与表格”) @服务 @特性({ @Property(name = "sling.servlet.paths", value = {"/bin/myServlet"}), @Property(name = "sling.servlet.methods", value = {"POST"}) })

    2. 我已在 org.apache.sling.servlets.resolver.SlingServletResolver 中授予我 /bin/myServlet 的权限。

    3. 使用了海报插件 - 将标头中的引用者设置为您网站层次结构中存在的一些 html,否则它将给出 403 禁止错误。还要提到要发送的参数并转到要发送的内容并从参数中说出正文。应填充以下文本框。现在尝试发布数据。

    4. 对于 CQ 特定部分:- 我已经实现了一个基于 AJAX 的解决方案,其中我在提交点击时使用 AJAX 发送 POST 调用。我还有一个自定义操作,其中包含以下代码的 forward.jsp。

      最终的 ValueMap 属性 = ResourceUtil.getValueMap(resource); 字符串路径 = properties.get("customRedirectPath", ""); //路径 = /bin/myServlet FormsHelper.setForwardPath(slingRequest, path); FormsHelper.setRedirectToReferrer(request, true);

    我的 AJAX 调用是:-

     argsObject = {
                oServiceUrl: "/bin/myServlet",
                oAjaxFormat: "html",
                oDataForAjax: $thisForm.serialize(),
                oAjaxCommMethod: "POST",
                oSuccessCallback: onSubmitSuccessCallback,
                oErrorCallback: onSubmitErrorCallback
                }
    

    一旦执行了这个 POST 调用,我就能够执行我的 servlet,并且我收到了所需的有效响应。

    如果这些步骤有帮助,请告诉我。

    【讨论】:

    • 我不认为 POSTER 插件使用浏览器 cookie。这可能会导致禁止错误。试试 postman - Chrome 的 REST 客户端。
    • @rakhi4110 :- 它确实使用了浏览器 cookie。问题是我没有在标题中提到导致此问题的引用者。现在已经解决了。谢谢:)
    猜你喜欢
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2017-04-15
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    相关资源
    最近更新 更多