필터 생성, 선언 및 매핑

필터 생성, 선언 및 매핑


필터를 만드는 것은 Filter 인터페이스를 실현하는 것처럼 간단합니다.필터를 초기화할 때 init 방법을 호출합니다. 필터의 설정, 초기화 파라미터와 서브렛 컨텍스트에 접근할 수 있습니다.프로그램이 닫힐 때 필터destroy 방법을 호출합니다.요청이 필터에 들어갈 때 doFilter 방법을 호출합니다. 이 방법은 서브렛 Request, 서브렛 Reponse, FilterChain 대상에 대한 접근을 제공합니다.

필터 체인 이해


처리 요청은 서브렛이 하나뿐이지만 여러 필터를 사용하여 이 요청을 차단할 수 있습니다. 즉, 필터 체인입니다.컨테이너가 모든 필터가 완료될 때까지 요청을 받아 필터에 전달한 다음 서브렛에 전달합니다.호출FilterChain.doFilter()은 필터 체인의 지속적인 실행을 촉발합니다. 현재 Filter가 필터 체인의 마지막이라면 호출FilterChain.doFilter()은 제어권을 서브렛 용기에 되돌려주고 요청을 서브렛에 전달합니다.현재 필터가 호출되지 않은 경우FilterChain.doFilter() 필터 체인이 끊어져 서브렛과 나머지 모든 필터에서 요청을 더 이상 처리할 수 없습니다.

URL 및 서브렛 이름에 매핑


서브렛과 같이 필터는 URL 모드에 매핑될 수 있습니다. 이것은 어떤 필터가 요청을 차단할지 결정합니다. URL 모드를 통해 서브렛 요청을 차단할 수 있을 뿐만 아니라 CSS, JS, 미디어 등 자원을 차단할 수 있습니다.그러나 URL을 매핑하는 방식은 분명 불편합니다.하나 이상의 서브렛 이름을 매핑할 수 있으며, 서브렛과 일치하는 경우 컨테이너가 해당 서브렛 이름과 일치하는 모든 필터를 찾아 요청에 적용합니다.

다른 요청 발송기 유형에 비추기


서브렛 컨테이너에서 다양한 방법으로 요청을 보낼 수 있습니다.
  • 일반 요청, 클라이언트에서 온 요청이며 컨테이너에 포함된 특정 웹 응용 프로그램의 대상 URL
  • 전송 요청은 코드가 RequestDispatcher의forward 방법을 호출하거나 라벨을 사용할 때 터치됩니다. 원본 요청과 관련이 있지만 내부에서 단독 요청 처리
  • 로 처리됩니다.
  • 요청을 포함하고 표준을 사용하거나 RequestDispatcher의include 방법을 호출할 때 원시 요청과 관련된 내부 포함 요청
  • , HTTP
  • , , AsyncContext
  • 배포 설명자 사용(web.xml)

    Servlet , 요소가 다르게 생성됩니다. 요소는 최소한 하나의 이름과 클래스를 포함하고 설명, 표시 이름, 아이콘 및 하나 이상의 초기화 파라미터를 포함할 수 있습니다.

    
     myFilter
     com.ww.myFilter
    
    

    서브렛과 달리 필터는 첫 번째 요청이 도착했을 때 불러올 수 없습니다. 필터의 init 방법은 항상 프로그램이 시작될 때 호출됩니다. ServletContextListener 초기화되면 Servlet 초기화되기 전에 배치 설명서에 나타난 순서대로 불러옵니다.
    이제 선언된 필터를 URL 또는 서브렛 이름에 매핑할 수 있습니다.
    
     myFilter
     /foo
     /bar/*
     myServlet
     REQUEST
     ASYNC
    
    

    유효 유형은 REQUEST/FORWARD/INCLUDE/ERRROR/ASYNC입니다. 지정하지 않으면 기본적으로 REQUEST 발송기만 사용합니다.

    메모 작업

    @WebFilter(
     filterName="",
     urlPattern={"/foo","/bar/*"},
     servletName={"myServlet"},
     dispatcherTypes={DispatcherTypes.REQUEST,DispatcherTypes.ASYNC}
    )
    public class MyFilter implements Filter
    
    

    메모를 사용하면 필터 체인의 필터를 정렬할 수 없다는 단점이 있습니다.

    프로그래밍 구성 사용


    서브렛, 모니터 및 다른 구성 요소와 마찬가지로 서브렛Context에서 필터를 프로그래밍하여 구성할 수 있습니다.배치 설명자와 주석을 사용하지 않고 호출
    @WebListener
    public class Configurator implements ServletContextListener
    {
        @Override
        public void contextInitialized(ServletContextEvent event)
        {
            ServletContext context = event.getServletContext();
    
            FilterRegistration.Dynamic registration =
                    context.addFilter("requestLogFilter", new RequestLogFilter());
            registration.addMappingForUrlPatterns(null, false, "/*");
    
            registration = context.addFilter("compressionFilter",
                    new CompressionFilter());
            registration.setAsyncSupported(true);
            registration.addMappingForUrlPatterns(null, false, "/*");
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent event) { }
    }
    

    좋은 웹페이지 즐겨찾기