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