您好我使用此代码为我的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
。我该怎么做才能解决这个问题?
答案 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也可能对你有用。
然而,我使用了不同的注释。
@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”}) })
我已经在org.apache.sling.servlets.resolver.SlingServletResolver中授予了我/ bin / myServlet的权限。
使用海报插件 - 将标题中的引用设置为您网站中存在的某些html,其他方面它会给出403禁止错误。还要提到要发送的参数,然后转到要发送的内容并从参数中说出正文。应填写以下文本框。现在尝试发布数据。
对于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);
我的AJAX电话是: -
argsObject = {
oServiceUrl: "/bin/myServlet",
oAjaxFormat: "html",
oDataForAjax: $thisForm.serialize(),
oAjaxCommMethod: "POST",
oSuccessCallback: onSubmitSuccessCallback,
oErrorCallback: onSubmitErrorCallback
}
执行此POST调用后,我能够执行我的servlet,并根据需要收到有效的响应。
如果这些步骤有帮助,请告诉我。