톰캣 필터 순서 조심해야지

기본

뷰와 서버단 모두 UTF-8인 환경에서 GET 방식으로 넘긴 한글 파라미터가 깨져서 몇 시간 동안 삽질 했습니다 -_-;

tomcat 6에는 useBodyEncoding=”ture” 세팅이 돼있어서 처음엔 URIEncoding 속성이 없어서 그러나 싶었는데, 기본으로 사용하는 필터에서 request 객체에 UTF-8로 세팅을 해주니 이건 상관 없죠. 계속 신경쓰였던 부분은 리얼 환경에선 제대로 되는데 유독 개발 환경에서만 한글이 깨진다는 거였습니다. 피들러로 살펴봐도 헤더부터 파라미터까지 똑같고..

결국 파트장님이랑 톰캣 디버깅 하다가 겨우 원인 발견!

제가 추가한 필터 순서 때문이었네요. request 객체에 인코딩 세팅 해주는 필터보다 일찍 타서 파라미터가 깨졌던 거죠. 톰캣은 useBodyEncoding 속성이 true면 요청 헤더에서 인코딩 정보를 가져오게 되는데 jQuery의 getJSON() 요청에 관련 헤더가 없었습니다. 이 경우 URIEncoding 속성이 있으면 여기에 세팅된 값으로 인코딩이 될텐데 이 속성도 없었던 터라 결국 톰캣 기본 인코딩인 ISO-8859-1을 사용!

리모트 디버깅에 톰캣 소스도 까보고 알찬 하루였네요 ㅋ

Spring MVC 인코딩 문제

기본

1. web.xml에 인코딩 필터를 등록합니다. (이건 GET방식으로 들어오는 데이터는 커버하지 못하고 POST는 처리할 수 있습니다.)

<filter>

<filter-name>encodingFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>encodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

 

2. server.xml (workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\conf )

GET으로 들어오는 데이터의 인코딩은 여기서 처리할 수 있습니다. (Tomcat 7 기준으로 userBodyEncoding=”true”는 먹히지 않더라구요.)

<Server …>

<Service …>

<Connector … URIEncoding=”UTF-8″/>

</Connector>

</Service>

</Server>

 

3. 그리고 jsp, html 파일에서 인코딩을 지정합니다.

<?xml version=”1.0″ encoding=”UTF-8″ ?>

<%@ page language=”java” contentType=”text/html; charset=UTF-8″    pageEncoding=”UTF-8″%>

<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ />

 

이렇게 지정 하니까 GET, POST로 왔다갔다 하는 데이터는 인코딩 문제가 없었습니다 🙂