Development/JSP
[Encoding, Servlet Filter] 웹 서버 구축하기 (7)
Go0G
2021. 11. 24. 23:35
개요
서블릿 프로그래밍 연습
- 한글 입력 깨짐 문제 해결
- Servelt Filter 구현
환경
- WAS Server: CentOS Linux release 7.9 - Tomcat 7.0 - JDK 1.8.0_312
관련 경로
servlet-api 라이브러리 | /[Tomcat Directory]/java/tomcat-servlet-api.jar |
ROOT Directory | /[Tomcat Directory]/tomcat/webapps/ROOT/ |
개념
한글이 깨지는 이유
- 멀티바이트(2byte) 문자 전송 문제
- Tomcat의 기본 인코딩 방식은 UTF-8이 아닌 ISO-8859-1 인코딩 방식을 이용
- 사용자의 입력을 2byte가 아닌 1byte로 처리
해결 방법
- Servlet에 설정: 읽어드리는 과정에서 UTF-8로 설정 ★
- 서버 설정 변경: server.xml 파일의 Connector에 URLEncoding="UTF-8" 추가
일반적으로 다른 서버에 영향을 끼칠수 있기 대문에 서버 설정을 변경하지 않음
Servelt Filter
- WAS <-> Servlet Container(Servelt Code)간 접근 제어 = Servlet의 Requset, Response 제어
- 모든 서블릿의 설정을 제어할 수 있음
실습
기존 Servelt에 추가
NoticeReg.java
import javax.servlet.annotation.WebServlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
@WebServlet("/notice-reg")
public class NoticeReg extends HttpServlet
{
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
request.setCharacterEncoding("UTF-8");//추가된 구문
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
String title = request.getParameter("title");
String content = request.getParameter("content");
out.println(title);
out.println(content);
}
}
Servlet Filter 이용
CharacterEncodingFilter.java
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.*;
import javax.servlet.FilterConfig;
@WebFilter("/*")
public class CharacterEncodingFilter implements Filter{
public void init(FilterConfig filterConfig){
/*필터 초기화 작업*/
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{
//chain.doFilter(request, response);
}
public void destroy(){
/* 주로 필터가 사용한 자원을 반납*/
}
}
NoticeReg.java 수정
import javax.servlet.annotation.WebServlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
@WebServlet("/notice-reg")
public class NoticeReg extends HttpServlet
{
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
String title = request.getParameter("title");
String content = request.getParameter("content");
out.println(title);
out.println(content);
}
}
결과: Servlet Filter에 의해 제어되고 있기 때문에 요청에 대한 응답 값이 반환되지 않음
Servlet Filter 완성 코드
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.*;
import javax.servlet.FilterConfig;
@WebFilter("/*")
public class CharacterEncodingFilter implements Filter{
public void init(FilterConfig filterConfig){
/*필터 초기화 작업*/
}
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException{
request.setCharacterEncoding("UTF-8"); //UTF-8 인코딩
chain.doFilter(request, response); //Requset, Response 연결
}
public void destroy(){
/* 주로 필터가 사용한 자원을 반납*/
}
}
Make_FilterClass.sh
#!/bin/bash
javac -classpath /usr/share/java/tomcat-servlet-api.jar CharacterEncodingFilter.java
mv ./CharacterEncodingFilter.class ./WEB-INF/classes
systemctl restart tomcat
결과: 서블릿 필터가 Requset에 대한 인코딩 과정을 수행하기 때문에 한글이 정상적으로 출력
Reference
더보기
[1] https://www.youtube.com/watch?v=iJ5cwyYgiu0&list=PLq8wAnVUcTFVOtENMsujSgtv2TOsMy8zd&index=19
[2] https://www.youtube.com/watch?v=d8GkAMpjDfs&list=PLq8wAnVUcTFVOtENMsujSgtv2TOsMy8zd&index=20