요청이 스프링 컨트롤러에 도달하기 전에 서블릿 필터에서 XML (POST 요청)을 가져와야하는 요구 사항에 대해 현재 작업 중입니다. 그런 다음 XML (빈 노드/요소 잘라 내기)을 처리해야합니다. 필터를 누른 다음 호출이 더 진행되어야합니다.POST 요청에서 XML을 가져와 서블릿 필터에서 수정하는 방법은 무엇입니까?
아래 코드 (첨부 된 스 니펫)를 시도하고 요청 본문 (XML)을 가져올 수 있었으며 수정 된 응답을 설정할 수있었습니다.
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
if (httpRequest.getMethod().equalsIgnoreCase("POST")) {
extractDataFromRequest(httpRequest);
httpResponse.getWriter().write("<root><root>");
}
chain.doFilter(request, wrappedResponse);
public static String extractDataFromRequest(HttpServletRequest request) throws IOException {
String line;
StringBuilder builder = new StringBuilder();
BufferedReader reader = request.getReader();
while ((line = reader.readLine()) != null) {
builder.append(line);
}
return builder.toString();
}
그러나 스프링이 다음 예외를 제외하고 실패했습니다.
Severe: java.lang.IllegalStateException: PWC3997: getReader() has already been called for this request
at org.apache.catalina.connector.Request.getInputStream(Request.java:1178)
at org.apache.catalina.connector.RequestFacade.getInputStream(RequestFacade.java:407)
at org.springframework.http.server.ServletServerHttpRequest.getBody(ServletServerHttpRequest.java:165)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:120)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:100)
전문가로부터이 요구 사항에 대한 구체적인 구현을 찾고 있습니다.
감사합니다. 그러나 응답의 수정 된 내용을 설정하는 방향을 얻으면 좋을 것입니다. 그래서 스프링 컨트롤러에서 수정 된 내용을 얻을 수 있습니다. – JayP
예제를 업데이트했습니다. 여기서 요청 본문을 변경 한 다음 계속합니다. Spring Interceptor를 사용하여이를 수행 할 수도 있습니다. –