在doPost中获取HttpServletRequestFilterable而非预期JSON的问题
问题:无法获取Mailgun Webhooks的JSON回调数据
我正在使用Mailgun Webhooks发送邮件,并用以下Servlet捕获回调信息:
public class MyServlet extends HttpServlet { @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { StringWriter stringWriter = new StringWriter(); PrintWriter printWriter = new PrintWriter(stringWriter); printWriter.println("MyServlet"); response.setContentType("text/plain"); //response.setContentType("application/json"); response.getOutputStream().print(stringWriter.toString()); } @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { System.out.println("HttpServletRequest below"); System.out.println(request); System.out.println("HttpServletResponse below"); System.out.println(response); } }
但doPost方法的打印结果如下:
HttpServletRequest below org.sitemesh.webapp.contentfilter.HttpServletRequestFilterable@4439aa1f HttpServletResponse below org.sitemesh.webapp.contentfilter.ContentBufferingFilter$1@4fa69476
根据Mailgun文档,他们应该会发送JSON响应,但我并未获取到,特此求助。
原因分析
- 直接打印
HttpServletRequest对象输出的是它的默认toString()结果(类全名+内存哈希码),这是Java对象的正常行为,不代表没有收到回调数据。 - 你看到的
HttpServletRequestFilterable是Sitemesh框架对原生Request的包装类,包装后的对象依然可以正常读取请求体内容。
解决方案
修改doPost方法,读取请求体中的JSON内容,而非直接打印Request对象:
@Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { // 读取请求体中的JSON内容 BufferedReader reader = request.getReader(); StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sb.append(line); } String requestBody = sb.toString(); // 打印获取到的JSON回调数据 System.out.println("Mailgun回调JSON内容:"); System.out.println(requestBody); // 可选:验证请求的内容类型 String contentType = request.getContentType(); System.out.println("请求内容类型:" + contentType); // 可选:将JSON解析为自定义对象(需引入Jackson/Gson等JSON解析库) // ObjectMapper mapper = new ObjectMapper(); // MailgunWebhookPayload payload = mapper.readValue(requestBody, MailgunWebhookPayload.class); }
额外检查项
- 确认Servlet的映射路径正确,Mailgun后台配置的Webhook地址指向该Servlet的POST路径。
- 排查Sitemesh等过滤器是否会拦截或修改请求体内容。
- 可先用Postman等工具模拟发送携带JSON体的POST请求到Servlet,验证读取逻辑是否正常,排除Mailgun侧的配置问题。
内容的提问来源于stack exchange,提问作者Tan
相关产品推荐
相关产品推荐

