ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Servlet Filter
    프로그래밍 공부/Servlet과 JSP 2021. 5. 31. 15:01

     

    뉴렉처 강사님의 동영상 강의를 정리한 글입니다.

     

    필터

     

    WAS는 사용자로 부터 요청이 들어오게 되면

    적절한 소프트웨어를 실행하여 실행 결과를 다시 클라이언트에게 반환한다.

    우리는 WAS로 tomcat을 사용하고 있고, tomcat이 실행하는 소프트웨어를 Servlet(서버쪽의 어플리케이션 조각)이라고 부른다. 이러한 Servlet이 실행되고 존재하는 메모리 공간을 Servlet Container라고 한다.

    WAS는 실행할 Servlet을 Servlet Container에 올려 사용하고 더이상 사용하지 않으면 해당 서블릿을 삭제한다.

     

    한편, 우리는 한글을 사용하고 있기 때문에 인코딩 코드를 해당 서블릿에 모두 작성해주어야 한다.

    톰캣의 서블릿 설정 파일에서 인코딩 방식을 설정해 줄 수 있지만, 여러 어플리케이션을 서비스하는 컨테이너인 톰캣의 설정을 바꾸는 것은 좋은 방법이 아니다.

     

    이럴 때 사용하는 것이 필터이다.

    Servlet을 실행하기 전이나 후에 Filter를 거치게 되면서 모든 서블릿에 공통되는 설정을 할 수 있다.

    (인증과 권한이 필요한 서비스에도 많이 사용된다.)

     

    필터 설정 방법

     

    새로운 클래스에 servlet.Filter를 추가하여 생성한다.

     

    CharacterEncodingFilter.java

    package com.newlecture.web.filter;
    
    import java.io.IOException;
    
    import jakarta.servlet.Filter;
    import jakarta.servlet.FilterChain;
    import jakarta.servlet.ServletException;
    import jakarta.servlet.ServletRequest;
    import jakarta.servlet.ServletResponse;
    
    public class CharacterEncodingFilter implements Filter {
    
    	@Override
    	public void doFilter(ServletRequest req
    			, ServletResponse res
    			, FilterChain chain)
    			throws IOException, ServletException {
    		System.out.println("hello filter");
    	}
    
    }
    

     

    xml 파일을 이용하여 filter 추가하기

    Servlet 코드와 비슷하게 filter와 filter-mapping 태그를 추가하여 내용을 넣어준다.

    "/*"에 해당하는 url을 매핑한다. 즉, 모든 url에 관해 filter를 매핑하는 것이다.

     

    <filter>
      	<filter-name>characterEncodingFilter</filter-name>
      	<filter-class>com.newlecture.web.filter.CharacterEncodingFilter</filter-class>
      </filter>
      <filter-mapping>
      	<filter-name>characterEncodingFilter</filter-name>
      	<url-pattern>/*</url-pattern>
      </filter-mapping>

     

    코드를 추가하고 실행해보면, 실행할 때 필터 클래스가 출력되고 페이지를 로드할 떄 마다 필터가 출력되는 것을 확인할 수 있다.

    filter에서 servlet을 실행할지 말지도 설정해주어야 한다. 이것을 가능하게 하는 것이 chain이다.

    chain을 설정해주지 않으면 filter는 실행하지만 servlet은 실행하지 않는다.

     

    System.out.println("before filter");
    chain.doFilter(req, res);
    System.out.println("after filter");

     

    berfore filter는 servlet 실행 전에 출력되고, after filter는 servlet이 실행되고 response된 후에 실행된다.

    조건문을 만들어 조건에 적합한 경우에만 chain 해 줄 수 있다.

     

    Annotation으로 filter 추가하기

    어떤 url과 매핑할 것인지를 작성하여 WebFilter 어노테이션을 이용한다.

     

    @WebFilter("/*")

    댓글

Designed by Tistory.