Java의 HttpServletRequest에서 원시 게시물 데이터를 검색하는 방법
Java에서 게시물 데이터를 얻으려고합니다. 가장 간단한 일 중 하나 여야하는 것 같습니까? 내 말은, HttpServletRequest.getParameter가 제대로해야합니까? 그러면 원시 포스트 데이터를 어떻게 얻을 수 있습니까?
HttpServletRequest가 JSON POST 데이터를 얻고 Kdeveloper의 코드를 사용하여 요청에서 게시물 데이터를 가져 오는 것을 발견했습니다 . 작동하지만 문제가 있습니다 . 게시물 데이터를 한 번만 가져올 수 있습니다 .
Kdeveloper의 코드에서 만든 방법은 다음과 같습니다.
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 () 메서드가 있어야합니다. 아무도 이것이 유용 할 것이라고 생각하지 않았습니까?
그렇다면 항상 올바른 게시물 데이터를 반환하도록이 메서드를 어떻게 작성할 수 있습니까?
요청 본문은 HttpServletRequest#getInputStream()
및에서 사용할 수 있습니다 #getReader()
.
InputStream body = request.getInputStream();
// ...
한 번만 읽을 수 있습니다. 클라이언트는 그것을 여러 번 다시 보내지 않을 것입니다. 호출 getParameter()
등도 암시 적으로 읽습니다. 시체를 어딘가에 저장하고 스스로 처리해야합니다.
IE가 텍스트 / 일반으로 게시해야하는 상황이 발생했기 때문에 getReader를 사용하여 매개 변수를 수동으로 구문 분석해야했습니다. 서블릿은 긴 폴링에 사용되었으므로 AsyncContext :: dispatch가 지연 후 실행되면 말 그대로 빈 손으로 요청을 다시 게시했습니다.
그래서 HttpServletRequest :: setAttribute를 사용하여 처음 나타날 때 요청에 게시물을 저장했습니다. 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\"}");
}
'IT TIP' 카테고리의 다른 글
XML :: Simple이 권장되지 않는 이유는 무엇입니까? (0) | 2021.01.07 |
---|---|
java : Rpc / 인코딩 된 wsdl은 JAXWS 2.0에서 지원되지 않습니다. (0) | 2021.01.07 |
'&'대 '&&'사용 (0) | 2021.01.07 |
자바 : org.w3c.dom.document에서 xpath 문자열을 통해 요소를 찾는 방법 (0) | 2021.01.07 |
isset () 대 strlen ()-빠르고 명확한 문자열 길이 계산 (0) | 2021.01.07 |