Hayden's Archive
[Servlet] Servlet의 한글 인코딩 처리 / Filter 본문
- 요청을 하면 폼값을 받고, 응답을 하면 페이지를 돌려줘야 하는데 이 때 영어는 깨지지 않지만 한글은 깨짐.
- 따라서 양방향 한글 인코딩 처리가 필요하다.
- 한글 처리부터 하고 폼값 받아와야 하고, 한글 처리부터 하고 응답해야 한다.
- 따라서 service() 메소드에 다음 코드를 포함시킨다.
request.setCharacterEncoding("utf-8"); //요청 관련 인코딩 처리
response.setContentType("text/html;charset=utf-8"); //응답 관련 인코딩 처리
- 그런데 filter를 사용하면 서블릿을 작성할 때마다 번거롭게 위 코드를 적어주지 않아도 된다.
- Filter의 원리
필터를 만들어주고 컨테이너가 알아들을 수 있게 등록해줘야 함. 필터 뒤에 있는 모든 컴포넌트에 연결한다.(chain)
Filter 처리 순서
1. web.xml 파일이 있을 경우
① 문자 인코딩을 할 Filter 클래스를 만들어주고 아래 코드를 작성한다.
package servlet.filter;
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 EncodingFilter implements Filter{
@Override
public void destroy() {}
@Override
//doFilter만 오버라이딩 해주면 됨.
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//요청과 응답 한글 처리...
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
//사전 작업(위에서 처리한 한글 처리 작업)의 내용이
//서버상의 다음 번 컴포넌트에게 계속 적용되기 위한 작업...
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
}
② web.xml 상단에 아래 코드를 추가한다. (필터는 요청을 거르지 않고 일단 모든 요청을 다 받음. 그러므로 매핑할 때 <url-pattern>/*</url-pattern> 이렇게 해줌.)
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>servlet.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2. web.xml 파일이 없을 경우 (Annotation 방식)
① 문자 인코딩을 할 Filter 클래스를 만들어주고 아래 코드를 작성한다.
package servlet.filter;
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;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
//Annotation
@WebFilter(
value= {"/*"},
initParams=@WebInitParam(name="encoding", value="utf-8")
)
public class EncodingFilter implements Filter{
@Override
public void destroy() { }
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//한글처리...
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//사전작업(한글처리)의 내용이 서버상의 다음번 컴포넌트에게 계속 적용되기 위한 작업...
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
}