* 본 글은 [뉴렉처]의 Servlet&JSP 프로그래밍 강의를 듣고 정리한 글입니다.
2020 Servlet&JSP 프로그래밍
www.youtube.com
사용자 입력: 한글 입력 문제
- POST 요청에 한글을 입력하면 깨지는 문제점
POST 요청 처리 과정
- 1) 입력 폼을 받기 위해 클라이언트가 서버에 GET 요청
- 2) 사용자가 값을 입력
- 3) 입력 폼에 값을 담아 클라이언트가 서버에 POST 요청
- 4) 서버는 그 값을 출력
멀티 바이트 문자 전송 문제: 사용자로부터 값을 입력받아 전송할 때 발생
- POST 요청으로 한글을 입력하면 깨지는 문제
- 서버가 브라우저에 값을 출력할 때의 문제가 아닌, 클라이언트가 서버에 POST 요청을 보낼 때 발생한 문제
- UTF-8은 멀티 바이트 문자
- 문자 하나당 숫자 하나가 연관되어 있음
- 영문자는 알파벳 하나당 숫자 하나가 1byte면 충분
- 한글, 일본어, 중국어: 영문자 위에 얹어진 확장된 숫자를 이용해 문자와 연관됨. 문자와 연결되어 있는 코드 값이 2byte
- 멀티 바이트: 문자 하나당 숫자 하나가 연관되어 있는데, 그숫자의 크기가 2byte 이상일 경우
- 멀티 바이트 문자 전송 문제가 발생하는 과정
- 1) POST로 한글을 전달할 때 기본적으로 2byte를 하나로 인코딩
- 2) 서버에서도 2byte를 하나로 인코딩해야 하지만, Tomcat의 기본적인 인코딩 방식은 ISO-8859-1(1byte를 하나로 인코딩)
- 3) 서버에서 한글이 깨져서 전달됨
- 4) 서버에서 클라이언트로 깨진 값을 응답하니 브라우저에서도 한글이 깨져서 출력됨
멀티 바이트 문자 전송 문제의 해결 방법 2가지
- 클라이언트가 POST 요청으로 전달한 값을 UTF-8로 인코딩하라고 서버에 요청해야 함
- 해결 1) Tomcat 홈 디렉토리>conf>server.xml의 <Connector>태그에 URIEncoding="UTF-8" 삽입
<Connector port="8090" protocol="HTTP/1.1"
connectionTimeout="99999"
redirectPort="8443"
maxParameterCount="1000"
URIEncoding="UTF-8"
/>
- 해결 2) 서버 설정을 변경할 수 없는 경우, 서블릿마다 아래의 코드를 작성
- request.setCharacterEncoding(”UTF-8”);
protected void service(HttpServletRequest request
, HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
String title_ = request.getParameter("title");
String content_ = request.getParameter("content");
out.println(title_);
out.println(content_);
}
- 결과
'☕ Java 웹 프로그래밍 > Servlet & JSP' 카테고리의 다른 글
[Servlet&JSP] 학습과제: 사용자 입력을 통한 계산 요청 (4) | 2023.05.26 |
---|---|
[Servlet&JSP] 서블릿 필터(Servlet Filter) (0) | 2023.05.25 |
[Servlet&JSP] 사용자 입력: 입력할 내용이 많은 경우는 POST 요청 (2) | 2023.05.24 |
[Servlet&JSP] 사용자 입력: 사용자로부터 입력받은 값으로 GET 요청 (0) | 2023.05.24 |
[Servlet&JSP] 사용자 입력: 기본 값 사용하기 (0) | 2023.05.24 |