【发布时间】: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?
【问题讨论】:
标签: javascript java osgi aem sling