Hayden's Archive

[Servlet] Servlet의 한글 인코딩 처리 / Filter 본문

Study/Java & Kotlin

[Servlet] Servlet의 한글 인코딩 처리 / Filter

_hayden 2020. 6. 9. 21:30

- 요청을 하면 폼값을 받고, 응답을 하면 페이지를 돌려줘야 하는데 이 때 영어는 깨지지 않지만 한글은 깨짐. 

- 따라서 양방향 한글 인코딩 처리가 필요하다.

- 한글 처리부터 하고 폼값 받아와야 하고, 한글 처리부터 하고 응답해야 한다.

- 따라서 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 {}
}