tomcat에서 PUT, DELETE request body 파싱 문제

2021. 3. 21. 01:55 Server, WAS/Tomcat

1. 문제상황

HTTP 메소드 DELETE로 request body를 이용하여 spring 컨트롤러에 요청을 쐈는데, 파라미터가 전부 null 로 넘어가는 것이 아닌가?? 띠용?

 

2. 문제점

tomcat의 문제라고 한다. tomcat은 request body를 POST 일때만 파싱하고 있었다.

코드까보기

  • 톰캣버전 : 8.0.48 (로컬 윈도우에 깔린거)
  • 경로 : org.apache.catalina.connector.Connector.java
  • 관련 코드
    • 76라인 : 생성자호출에서 this.parseBodyMethods = "POST";
    • 196~212라인 : getter, setter 메소드
public String getParseBodyMethods() {
  return this.parseBodyMethods;
}

public void setParseBodyMethods(String methods) {
  HashSet<String> methodSet = new HashSet();
  if (null != methods) {
	  methodSet.addAll(Arrays.asList(methods.split("\\s*,\\s*")));
  }

  if (methodSet.contains("TRACE")) {
	  throw new IllegalArgumentException(sm.getString("coyoteConnector.parseBodyMethodNoTrace"));
  } else {
	  this.parseBodyMethods = methods;
	  this.parseBodyMethodsSet = methodSet;
  }
}
  • 이해 : POST만 디폴트로 초기화하고, server.xml 에서 parseBodyMethods="POST,DELETE" 이런식으로 넣어줘야 set되겠다.

동일이슈

마찬가지로 PUT 도 requestBody에 넣으면 못알아먹는다.

DELETE의 스펙이해

https://stackoverflow.com/questions/299628/is-an-entity-body-allowed-for-an-http-delete-request

애초에 delete 메소드에 request body 로 넘기는 것이...ㅠㅠ

3. 해결

톰캣서버 server.xml 에 추가 <Connector parseBodyMethods="POST,PUT,DELETE" />



출처: https://sjh836.tistory.com/142?category=679845 [빨간색코딩]