AEM 中的 Servlet,POST 请求中的正文丢失
Posted
技术标签:
【中文标题】AEM 中的 Servlet,POST 请求中的正文丢失【英文标题】:Servlet in AEM, body in POST request is lost 【发布时间】:2022-01-02 14:20:05 【问题描述】:我在 AEM 中创建了一个自定义工具,我希望该自定义工具调用一个 servlet(POST json)。
servlet 被调用,但 request.getParameterMap() 返回空映射。
我的 servlet 代码是
@Component(
service=Servlet.class,
property=
Constants.SERVICE_DESCRIPTION + "=Custom Servlet",
"sling.servlet.methods=" + HttpConstants.METHOD_POST,
"sling.servlet.paths=" + "/apps/myapp/customServlet"
)
public class CustomServlet extends SlingAllMethodsServlet
@Override
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response)
throws IOException
String method = request.getMethod(); // method POST OK
Map map = request.getParameterMap(); // return map but empty
String name = request.getParameter("foo"); // also this return null
response.setStatus(SlingHttpServletResponse.SC_OK);
response.setContentType("application/json;charset=UTF-8");
response.getWriter().print("\"response message\" : \"" + foo + "\"");
和我的 JS 代码(作为客户端库加载到 AEM 自定义工具页面)
window.onload = function()
var url = '/apps/myapp/customServlet';
var button = document.getElementById('btnSubmit');
button.addEventListener('click', event =>
var foo = document.getElementById('foo').value;
if (foo.length < 1)
alert("input required!!");
else
var requestData = ;
requestData.foo= foo;
console.log(requestData); // it is ok
postData(url,requestData).then(data => console.log(data);); // got response message:null
);
async function postData(url, data)
const response = await fetch(url,
method: 'POST',
headers:
'Content-Type': 'application/json',
,
body: JSON.stringify(data)
);
return response.json();
另外,我在 Adobe Granite CSRF Filter Config 中删除了过滤方法的 POST。
我是否需要任何其他 OSGi 配置或我的代码有问题才能在 AEM 中使用 Post Servlet?
【问题讨论】:
【参考方案1】:要从请求正文中获取有效负载,您可以使用request.getReader()
例如:
String body = IOUtils.toString(request.getReader()); //apache commons io
或者使用一些 json 映射器来立即获取你的 java 对象
YourObject yourObject = new ObjectMapper().readValue(request.getReader(), YourObject.class); // jackson
【讨论】:
非常感谢 mkovacek!!!!!!!我可以使用IOUtils.toString(request.getReader());
获取请求正文【参考方案2】:
我看到了
var requestData = ; // creating an empty array
并且您将其发布到 servlet。
我认为您想将“foo”从 document.getElementById
解析为 servlet。
【讨论】:
以上是关于AEM 中的 Servlet,POST 请求中的正文丢失的主要内容,如果未能解决你的问题,请参考以下文章
AEM 中 doFilter servlet 的调度程序白名单
从 Java servlet 中的 POST 请求获取请求有效负载
为啥servlet中的response.sendRedirect()在收到JQuery的post请求后不起作用?