CQ5:403调用Post servlet时发生Forbidden

时间:2014-04-01 23:46:17

标签: java servlets post cq5 sling

您好我使用此代码为我的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。我该怎么做才能解决这个问题?

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:2)

我也在使用相同的代码来满足相似的要求,我被困在这个错误上。 我已经解决了。

PFB的步骤。它们中的任何一个/ All也可能对你有用。

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

    @Component(         immediate = true,metatype = true,label =“Engage Now Form”,         description =“现在参与表格”) @服务 @Properties({     @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进行了自定义操作。

    final ValueMap properties = ResourceUtil.getValueMap(resource);     String path = properties.get(“customRedirectPath”,“”); // path = / bin / myServlet     FormsHelper.setForwardPath(slingRequest,path);     FormsHelper.setRedirectToReferrer(request,true);

  5. 我的AJAX电话是: -

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

    执行此POST调用后,我能够执行我的servlet,并根据需要收到有效的响应。

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