[Servlet
] --HTML코드 출력 문제--> JSP
--스파게티 코드 문제--> JSP MVC
-> Spring MVC
-> SpringBoot
WS
<-> WAS
<-----request / respond
-----> Servlet Container
WAS는 들어오는 요청에 대해 매핑된 Servlet을 실핼하고 응답해주는데
그런 Servlet들이 메모리에 생성되어진다. 그 메모리 공간이Servlet Container
WS
<-> WAS
<-----Servlet Filter [request / respond]
-----> Servlet Container
앞서 한글을 입력해 요청을 보낼 때 발생했던 문제를 해결하기 위해서
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
코드를 추가했다.
이는 한글 입력이 필요한 Servlet을 만들 때에는 항상 위의 코드를 추가해야함을 의미한다.
Servlet Filter는
WAS
<-----request / respond
----->Servlet Container
사이의 request와 respond를
가로채서 Filtering을 한다.
- Servlet Filter를 통하면 매 Servlet마다 인코딩 방식에 대한 선언을 하지 않아도 될 것이다.
Servlet Filter가 request와 respond 중간에 끼는 수문장 역할을 하는지 확인해보기 위해
Servlet Filter가 호출될 때마다 Request || Respond / Servlet Filter
를 출력하게 해보겠다.
public class CharacterEncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse
, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Request / Servlet Filter");
chain.doFilter(request,response);
System.out.println("Respond / Servlet Filter");
}
}
코드를 작성한 뒤, Servlet Filter를 적욯하기 위해서는
두 가지 방식이 있다. (Servlet을 등록할 때처럼!!)
web.xml
에 아래 태그를 통해 Servlet Filter를 설정했다.
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>com.jongky.web.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
web.xml 설정을 통한 Servlet Filter가 정상적으로 작동하는 것을 확인할 수 있다.
Servlet Filter가 선언된 클래스에
@WebFilter("/*")
Annotation을 추가함으로써 Servlet Filter를 적용할 수 있다.
Annotation을 통한 Servler Filter가 정상적으로 작동하는 것을 확인할 수 있다.
Client
는 WS
에게 URL을 통해 localhost:8080/notice-reg.html
요청
WS
는 WAS
에게 notice-reg.html
요청을 보내는데 Servlet Filter
가 요청을 가로채
Request / Servlet Filter
출력
chain.doFilter(request, respond);
로 인해 WAS
로 요청이 보내진 뒤, notice-reg.html
를 담은 응답을 WS
로 보냄
응답을 Servlet Filter
가 가로채 Request / Servlet Filter
출력
그 다음 응답이 WS
로 보내지고, WS
는 Client
에게 notice-reg.html
응답!!
Servlet Filter
가 Servlet 로직 실행 전/후에 요청과 응답을 가로채는 것을 이용해
System.out.println("Request / Servlet Filter");
대신
request.setCharacterEncoding("UTF-8");
System.out.println("Respond / Servlet Filter");
대신
respond.setCharacterEncoding("UTF-8");
결국 Servlet FIlter를 구성하게 되면 매 Servlet에서 인코딩 방식을 설정하지 않아도 된다.
문제없이 인코딩이 된다.