Servlet / JSP ) 6. Servlet Filter

60jong·2022년 5월 20일
0

Servlet / JSP

목록 보기
6/17

Server 공부 흐름

[Servlet] --HTML코드 출력 문제--> JSP --스파게티 코드 문제--> JSP MVC -> Spring MVC -> SpringBoot


Servlet Container

WS <-> WAS <-----request / respond-----> Servlet Container

WAS는 들어오는 요청에 대해 매핑된 Servlet을 실핼하고 응답해주는데
그런 Servlet들이 메모리에 생성되어진다. 그 메모리 공간이 Servlet Container



Servlet Filter

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를 적욯하기 위해서는

  • web.xml 설정을 통한 Servlet Filter
  • Annotation을 통한 Servler Filter

두 가지 방식이 있다. (Servlet을 등록할 때처럼!!)


web.xml 설정을 통한 Servlet Filter

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가 정상적으로 작동하는 것을 확인할 수 있다.


Annotation을 통한 Servler Filter

Servlet Filter가 선언된 클래스에
@WebFilter("/*") Annotation을 추가함으로써 Servlet Filter를 적용할 수 있다.

Annotation을 통한 Servler Filter가 정상적으로 작동하는 것을 확인할 수 있다.



Servlet Filter 흐름

  • ClientWS에게 URL을 통해 localhost:8080/notice-reg.html 요청

  • WSWAS에게 notice-reg.html 요청을 보내는데 Servlet Filter가 요청을 가로채
    Request / Servlet Filter 출력

  • chain.doFilter(request, respond);로 인해 WAS로 요청이 보내진 뒤, notice-reg.html를 담은 응답을 WS로 보냄

  • 응답을 Servlet Filter가 가로채 Request / Servlet Filter 출력

  • 그 다음 응답이 WS로 보내지고, WSClient에게 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에서 인코딩 방식을 설정하지 않아도 된다.


문제없이 인코딩이 된다.

profile
울릉도에 별장 짓고 싶다

0개의 댓글