Spring4 HiddenHttpMethodFilter HiddenMethod(REST를 지원하지 않는 브라우저 처리)

스프링로고

들어가기

혹시나 하는 마음으로 메모를 한다. PUT, PATCH, DELETE 방식의 메소드를 지원하지 않는 브라우저가 있다고 하는데.... 이를 위해 스프링 진영에서 HiddenHttpMethodFilter 라는 것을 제공한다.

HiddenHttpMethodFilter 맥락은 HiddenMethod(지원이 안되는 메소드명을 _method라는 이름에 담아서) + POST 요청을 스프링 컨트롤러에 전송하는 방법이다. HiddenHttpMethodFilter 는 요청에서 _method 의 값을 필터링 해서 적절한 컨트롤러로 연결해주는 것 같다.

web.xml 설정

web.xml 에 아래 필터를 추가한다.

1
2
3
4
5
6
7
8
9
10
<!-- Enables support for DELETE and PUT request methods with web browser clients -->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

화면단

회원을 삭제하는 요청을 아래처럼 만들수 있다. 중요한 것은 form의 method는 post이고, form 내부에 _method라는 이름에 delete 값을 갖는 input 태그가 있다. 위에서 말했듯이 아래 form을 전송하면 form method대로 post형식으로 리퀘스트가 스프링에게 전송된다. hiddenHttpMethodFilter는 리퀘스트를 후킹해서 _mehtod 값을 읽어 그 내용과 일체하는 컨트롤러를 찾아 연결해준다.

1
2
3
4
5
<form action="/sample/deleteUser" method="post">
<input type="hidden" name="_mehtod" value="delete">
<input type="text" name="id" >
<input type="submit" value="deleteUser">
</form>

마무리

사실 요즘 REST가 지원이 안되는 브라우저가 있는지는 모르겠다. 혹시나 해서....