如何从java中的HttpServletRequest中检索原始数据
我试图用Java获取发布数据。 似乎应该是最简单的事情之一,对吗? 我的意思是,HttpServletRequest.getParameter必须做到这一点? 那么你怎样才能得到原始的数据?
我发现HttpServletRequest获取JSON POST数据,并使用Kdeveloper的代码从请求中提取发布数据。 它的工作,但是有一个问题:我只能得到这个post数据一次 。
下面是我从Kdeveloper的代码中创build的方法:
public static String getPostData(HttpServletRequest req) { StringBuilder sb = new StringBuilder(); try { BufferedReader reader = req.getReader(); reader.mark(10000); String line; do { line = reader.readLine(); sb.append(line).append("\n"); } while (line != null); reader.reset(); // do NOT close the reader here, or you won't be able to get the post data twice } catch(IOException e) { logger.warn("getPostData couldn't.. get the post data", e); // This has happened if the request's reader is closed } return sb.toString(); }
以前,我在这个方法的最后closures了阅读器,但是当方法在同一个请求上运行多次时,会导致exception。 不closures它,不会发生exception,但该方法返回一个空string。
老实说,应该有一个暴露的req.getPostData()方法 – 没有人认为这会有用吗?
那么我怎么能写这个方法,以便它总是返回正确的发布数据?
请求正文由HttpServletRequest#getInputStream()
和#getReader()
。
InputStream body = request.getInputStream(); // ...
请注意,您只能阅读一次。 客户端不会多次重新发送。 调用getParameter()
等隐式也会读取它。 你必须把身体储存在某个地方,然后自己处理。
我们遇到了一个情况,即IE迫使我们以文本/纯文本的forms发布,所以我们不得不使用getReader手动parsing参数。 该servlet被用于长时间轮询,所以当AsyncContext :: dispatch在延迟之后被执行时,它实际上是将空请求重新发送。
所以我刚刚通过使用HttpServletRequest :: setAttribute首次出现在请求中的post。 getReader方法会清空缓冲区,getParameter也会清空缓冲区,但会自动存储参数。
String input = null; // we have to store the string, which can only be read one time, because when the // servlet awakens an AsyncContext, it reposts the request and returns here empty handed if ((input = (String) request.getAttribute("com.xp.input")) == null) { StringBuilder buffer = new StringBuilder(); BufferedReader reader = request.getReader(); String line; while((line = reader.readLine()) != null){ buffer.append(line); } // reqBytes = buffer.toString().getBytes(); input = buffer.toString(); request.setAttribute("com.xp.input", input); } if (input == null) { response.setContentType("text/plain"); PrintWriter out = response.getWriter(); out.print("{\"act\":\"fail\",\"msg\":\"invalid\"}"); }