首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在java中从HttpServletRequest中检索原始post数据

如何在java中从HttpServletRequest中检索原始post数据
EN

Stack Overflow用户
提问于 2011-02-17 08:08:11
回答 2查看 156.6K关注 0票数 57

我正在尝试用Java获取post数据。看起来这应该是最简单的事情之一,对吧?我的意思是,HttpServletRequest.getParameter必须这样做,对吗?那么,如何获得原始的post数据呢?

我找到了HttpServletRequest get JSON POST data,并使用Kdeveloper的代码从请求中提取post数据。它是有效的,但有一个问题:我只能获取一次post数据。

下面是我从Kdeveloper的代码中创建的方法:

代码语言:javascript
复制
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();
}

以前,我在此方法的末尾关闭了读取器,但当该方法在同一请求上运行不止一次时,会导致异常。如果不关闭它,则不会发生任何异常,但该方法返回一个空字符串。

老实说,应该只有一个公开的req.getPostData()方法-没有人认为这会有用吗?

那么,如何编写此方法以使其始终返回正确的post数据呢?

EN

回答 2

Stack Overflow用户

发布于 2013-06-07 00:38:37

我们遇到了IE强迫我们以文本/纯文本格式发布的情况,所以我们不得不使用getReader手动解析参数。servlet用于长时间轮询,因此当AsyncContext::dispatch在一段延迟后执行时,它实际上是空手重新发送请求。

因此,当post第一次出现时,我使用HttpServletRequest::setAttribute将其存储在请求中。getReader方法清空缓冲区,getParameter也清空缓冲区,但会自动存储参数。

代码语言:javascript
复制
    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\"}");
    }       
票数 7
EN

Stack Overflow用户

发布于 2020-04-17 08:20:18

这对我来说很有效:(请注意,需要java 8)

代码语言:javascript
复制
String requestData = request.getReader().lines().collect(Collectors.joining());
UserJsonParser u = gson.fromJson(requestData, UserJsonParser.class);

UserJsonParse是一个向gson展示如何解析json共振峰的类。

类是这样的:

代码语言:javascript
复制
public class UserJsonParser {

    private String username;
    private String name;
    private String lastname;
    private String mail;
    private String pass1;
//then put setters and getters
}

解析的json字符串如下所示:

代码语言:javascript
复制
$jsonData: {    "username": "testuser",    "pass1": "clave1234" }

其余的值(mail、lastname、name)设置为null

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5023718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档