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();


另外,我在 Adob​​e 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请求后不起作用?

Servlet处理GET和POST请求

AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式

AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式