ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 필터(Filter), 래퍼(Wrapper)
    language/Servlet&JSP 2019. 3. 14. 15:58
    반응형

    필터는 서블릿과 비슷한 자바 컴포넌트 입니다. 컨테이너에 전달된 요청이 서블릿을 호출하기 전에 이 필터를 거치게 됩니다.


    실제로 필터를 구현한 클래스 입니다. filter 인터페이스를 구현했습니다. 이 때 init 메소드를 반드시 구현해야 합니다. 일반적으로는 config 객체를 저장합니다. 그리고 doFilter에서 실제로 필요한 코딩을 하게 됩니다. 마지막에 FilterChain 객체의 doFilter() 메소드를 호출하는데 이 부분이 다음에 실행될 필터 또는 서블릿을 호출하는 부분입니다.


    배포서술자에 필터를 정으하고 매핑할 수 있습니다. 서블릿처럼 이름과 클래스 위치로 필터를 정의하고 초기화 파라미터도 지정할 수 있습니다. 필터를 url이나 servlet에 매핑시키면 해당하는 요청이 들어왔을 때 필터를 거치게 됩니다.


    필터에서 서블릿의 service 메소드를 호출할 때 request, response 객체를 인자로 넘겨주게 됩니다. 알다시피 servlet의 response 객체는 OuputStreamWriter 객체를 참조하고 있고 servlet 에서는 이 객체를 통해 직접 응답을 클라이언트로 전달합니다. 문제는 필터에서 응답, 즉 response 객체에 접근하고 싶을 때 발생합니다. service 메소드가 종료된 시점에서 이미 response 가 클라이언트로 전달 된 다음이기 때문에 필터에서는 response 객체에 접근할 수가 없습니다. 이 때 사용하는 것이 바로 wrapper 클래스 입니다. 필터에서 wrapper 클래스를 만들어 진짜 response객체 대신 래퍼객체를 보내는 것입니다. 그렇게 되면 servlet에서는 실제 outputstream이 아닌 래퍼의 outputstream에 응답을 작성하게 되고 필터에서 이 응답에 접근할 수 있게 됩니다.


    쿠키값을 다 소문자로 바꾸는 래퍼를 만들어 보겠습니다. responsewrapper 클래스를 확장하여  필요한 메서드만 재정의 한 것을 볼 수 있습니다. 생성자를 보면 response 객체를 파라미터로 받아옵니다. 필터 클래스에서 객체를 생성할 때 꼭 response 객체를 인자로 줘야 합니다.


    반응형
Designed by Tistory.