Java 获取Spring应用程序中的HttpServetRequest正文数据
我有一个spring应用程序,里面有一些servlet。这些请求都与ServletComponentScan一样连接并使用,但在Servlet中,当它尝试使用“getInputStream”或其他什么时,它不会返回任何数据。我猜这是因为Spring首先读取主体,数据只能读取一次。有没有办法让它正常工作Java 获取Spring应用程序中的HttpServetRequest正文数据,java,spring,spring-mvc,tomcat,servlets,Java,Spring,Spring Mvc,Tomcat,Servlets,我有一个spring应用程序,里面有一些servlet。这些请求都与ServletComponentScan一样连接并使用,但在Servlet中,当它尝试使用“getInputStream”或其他什么时,它不会返回任何数据。我猜这是因为Spring首先读取主体,数据只能读取一次。有没有办法让它正常工作 @WebServlet(urlPatterns={"/servlet"}) public class ServletController extends HttpServlet { pr
@WebServlet(urlPatterns={"/servlet"})
public class ServletController extends HttpServlet {
private static final Logger logger = LoggerFactory.getLogger(ServletController.class);
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = resp.getWriter();
String bodyData = extractBody(req);
out.println("BodyData: " + bodyData);
}
public static String extractBody(HttpServletRequest request) {
StringBuffer sb = new StringBuffer();
String line = null;
BufferedReader reader = null;
try {
InputStreamReader isr = new InputStreamReader(request.getInputStream());
reader = new BufferedReader(isr);
int i;
while ((i = reader.read()) != -1) {
sb.appendCodePoint(i);
}
} catch (Exception e) {
logger.error("Failed to read from servletRequest with content-length: {}", request.getHeader("Content-Length"));
e.printStackTrace();
}
return sb.toString();
}
}
上面是一个例子,当它自己在tomcat或其他任何东西中时,它是好的。当它出现在与Spring相关的应用程序中时,它就不起作用了
弹簧
$ curl -X POST -d'{}' http://localhost:8080/servlet
BodyData:
普通Servlet(内置于“plainservlet.war”中并部署到tomcat)
。。。这很愚蠢,但答案似乎是Spring实际上正在验证请求,而普通servlet则没有(duh)。它需要适当的标题和内容
$ curl -X POST -d'{}' -H "Content-type: application/json" http://localhost:8080/servlet
BodyData: {}
$ curl -X POST -d'{}' -H "Content-type: application/json" http://localhost:8080/servlet
BodyData: {}