【发布时间】:2017-06-01 17:32:08
【问题描述】:
我有一个 spring 应用程序,其中包含一些 servlet。这些请求都已连接起来并像 ServletComponentScan 一样使用,但在 Servlet 中,当它尝试使用“getInputStream”或其他任何内容时,它不会返回任何数据。我猜这是因为 Spring 首先读取主体,并且数据只能读取一次。有没有办法让它正常工作?
@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:
Plain Servlet(内置于“plainservlet.war”并部署到 tomcat)
# curl -X POST -d'{}' http://localhost:8081/plainservlet/servlet
BodyData: {}
【问题讨论】:
标签: java spring spring-mvc tomcat servlets