2월 04, 2024

[Servlet Filter] 한글깨짐 Filter에서 Encoding 바꾸어서 해결해보기

 Servlet으로 한글 value를 POST로 넘겨주면 받을 때 한글이 깨져 보이는 경우가 있다. 

여기서 Encoding 방식을 바꿔주면 되는데, Servlet에서 사용되는 Filter를 사용해서 쉽게 구현을 할 수 있다. 


1. Servlet Filter란?

Client로부터 Server로 요청이 들어오기 전에 서블릿을 거쳐서 filtering하는 것을 Servlet Filter (서블릿 필터) 라고 한다. 공통적인 기능들을 서블릿이 호출되기 전에 전처리, 혹은 후처리하고 싶을 경우 Servlet Filter로 구현할 수 있다. 


2. Filter 구현시 override 필요한 메소드


특정 class를 Filter를 implements 하기 위해서는 위 세 가지 method를 구현해주어야 한다. 

1) init(filterConfig:FilterConfig)

=> 서블릿 컨테이너가 필터 인스턴스를 초기화하기 위해서 호출하는 메소드

2) doFilter(request:ServletRequest, response:ServletResponse, chain:FilterChain)

=> 필터에서 구현해야 하는 로직을 구현하는 메소드

3) destroy() : void

=> 필터를 종료하기 전에 호출하는 메소드



우리가 흔히 Servlet에서 Filter가 이루어진다고 하는 것은 doFilter() 메소드에서 구현을 하면 된다. 

@Override
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain) 
throws IOException, ServletException {
    //전처리

chain.doFilter(request, response);
    //후처리
}


필터는 요청을 받을 때 수행이 되고 chain.doFilter() 를 통해 다음 부분으로 넘겨주게 된다. 따라서 chian.doFilter 메소드 전에 전처리를 해주고 이후에 후처리를 해주면 된다. 


3. Encoding 방식 Servlet Filter를 통해 바꾸어보기

우리는 실제 filtering이 이루어지는 doFilter를 통해 Encoding 방식을 UTF-8로 바꾸어줄 것이다. 또한 Filter를 구현하여 새로운 class를 만들어줄 것이다. 

package org.example.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter("/+")
public class EncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig)
    throws ServletException {

}

@Override
public void doFilter(ServletRequest request,
    ServletResponse response, FilterChain chain) 
    throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");

chain.doFilter(request, response);
}

@Override
public void destroy() {

}
}


EncodingFilter라는 새로운 class를 만들었고 Filter를 구현해주었다. Filter를 implmenets 하기 위해서는 init(), doFilter(), destroy() 메소드를 모두 override해주어야 하기 때문에 모두 @Override를 해주었다. 


init() 과 destroy()에는 특별히 추가해야 하는 메소드는 없고 doFilter 메소드에 전처리 과정으로 CharacterEncoding을 설정해주었다. 


또 주목해야 할 것은 

@WebFilter라는 annotation인데 이는 필터링 경로를 설정해주는 것이다. 특정 경로로 요청이 들어왔을 때 filtering이 작동하는 것이다. 


만약 어떤 경로로 들어오든 Servlet Filter를 작동시키고 싶다면 위 코드처럼 

@WebFilter("/+")

라고 써주면 된다. 


12월 31, 2023

[Java] cannot resolve symbol servlet 해결법, Servlet Interface 구현해보기

 Java에서 



이런 식으로 Servlet implements가 불가능하며 

빨간 줄에 커서를 대고 

'cannot resolve symbole servlet' 이라는 에러 메세지가 뜬다면 dependency의 문제일 확률이 높다.


build.gradle 파일에 가서 수정을 해주면 되는데,

implementation 'org.apache.tomcat.embed:tomcat-embed-core:8.5.42'
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper:8.5.42'


나는 이 두 줄을 추가하고 build 하니 해당 에러 메세지를 해결 할 수 있었다. 


참고로 Servlet Interface를 implement할 경우 method를 모두 다 override 해주어야 하므로 

모든 추상 메서드에 대한 override method가 설정이 되어야 비로소 빨간 줄이 모두 없어진다. 


import javax.servlet.*;
import java.io.IOException;

public class ExampleServlet implements Servlet {

@Override
public void init(ServletConfig servletConfig) throws ServletException {

}

@Override
public ServletConfig getServletConfig() {
return null;
}

@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

}

@Override
public String getServletInfo() {
return null;
}

@Override
public void destroy() {

}
}


Servlet Interface를 구현한 예시 Servlet class이니 참고하면 될 것 같다.