Tomcat 5.0 ~ 7.0 한글 인코딩 설정

2011년 8월 1일에 devtainer.blogspot.kr 에서 섰던 글입니다. 추억 팔이로 옮겨 놓습니다. 2011년 추억 속으로…. - 원문: http://devtainer.blogspot.kr/2011/08/tomcat-50-70.html


한동안 Tomcat을 사용하지 않다가 오랜만에 사용했더니 인코딩 관련 착각을 해서 한참을 삽질 했습니다. 한글 인코딩에 대하여 간략하게 정리합니다.

톰켓의 기본 인코딩은 ISO-8859-1 입니다. 따라서 한글을 정상적으로 처리하기 위해서는 추가적인 인코딩 설정이 필요합니다. 인코딩 설정은 http get 메서드와 http post 메서드를 개별적으로 설정합니다.

HTTP Get 메서드 인코등 설정

  • [TOMCAT_HOME]/conf/server.xml 수정
  • Connector port=“8080” 엘레먼트에 URIEncoding=“UTF-8” 속성 추가
<connector port="8080" protocol="HTTP/1.1"
    connectiontimeout="20000" redirectport="8443"
    uriencoding="UTF-8">
</connector>

HTTP Post 메서드 인코등 설정

  • 인코딩 필터 클래스 추가 - tomcat example 애플리케이션의 encoding 클래스 재 사용
  • 애플리케이션의 web.xml에 인코딩 필터 설정 추가

인코딩 필터를 적용함으로서 request.setCharacterEncoding() 코드를 제거할 수 있다.

package filters;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class SetCharacterEncodingFilter implements Filter {

  protected String encoding = null;
  protected FilterConfig filterConfig = null;
  protected boolean ignore = true;

  public void destroy() {
    this.encoding = null;
    this.filterConfig = null;
  }

  public void doFilter(ServletRequest request,
            ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
    // Conditionally select and set the character encoding to be used
    if (ignore || (request.getCharacterEncoding() == null)) {
      String encoding = selectEncoding(request);
      if (encoding != null)
        request.setCharacterEncoding(encoding);
      }

      chain.doFilter(request, response);
    }

  public void init(FilterConfig filterConfig)
              throws ServletException {
    this.filterConfig = filterConfig;
    this.encoding = filterConfig.getInitParameter("encoding");
    String value = filterConfig.getInitParameter("ignore");
    if (value == null)
      this.ignore = true;
    else if (value.equalsIgnoreCase("true"))
      this.ignore = true;
    else if (value.equalsIgnoreCase("yes"))
      this.ignore = true;
    else
      this.ignore = false;
    }

  protected String selectEncoding(ServletRequest request) {
    return (this.encoding);
  }
}

위 클래스를 web.xml에 다음과 같이 인코딩 필터로 등록해야 합니다.

<filter>
  <filter-name>Set Character Encoding</filter-name>
  <filter-class>
      filters.SetCharacterEncodingFilter
  </filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
</filter>

<filter-mapping>
  <filter-name>Set Character Encoding</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
김태완 avatar
작성자: 김태완
1999년 부터 Java, Framework, Middleware, SOA, DB Replication, Cache, CEP, NoSQL, Big Data, Cloud를 키워드로 살아왔습니다. 현재는 빅데이터와 Machine Learning을 중점에 두고 있습니다.
E-mail: taewanme@gmail.com