필터 생성, 선언 및 매핑
3809 단어 JavaWeb 고급 프로그래밍 독서 노트
필터 생성, 선언 및 매핑
필터를 만드는 것은 Filter 인터페이스를 실현하는 것처럼 간단합니다.필터를 초기화할 때
init
방법을 호출합니다. 필터의 설정, 초기화 파라미터와 서브렛 컨텍스트에 접근할 수 있습니다.프로그램이 닫힐 때 필터destroy
방법을 호출합니다.요청이 필터에 들어갈 때 doFilter
방법을 호출합니다. 이 방법은 서브렛 Request, 서브렛 Reponse, FilterChain 대상에 대한 접근을 제공합니다.필터 체인 이해
처리 요청은 서브렛이 하나뿐이지만 여러 필터를 사용하여 이 요청을 차단할 수 있습니다. 즉, 필터 체인입니다.컨테이너가 모든 필터가 완료될 때까지 요청을 받아 필터에 전달한 다음 서브렛에 전달합니다.호출
FilterChain.doFilter()
은 필터 체인의 지속적인 실행을 촉발합니다. 현재 Filter가 필터 체인의 마지막이라면 호출FilterChain.doFilter()
은 제어권을 서브렛 용기에 되돌려주고 요청을 서브렛에 전달합니다.현재 필터가 호출되지 않은 경우FilterChain.doFilter()
필터 체인이 끊어져 서브렛과 나머지 모든 필터에서 요청을 더 이상 처리할 수 없습니다.URL 및 서브렛 이름에 매핑
서브렛과 같이 필터는 URL 모드에 매핑될 수 있습니다. 이것은 어떤 필터가 요청을 차단할지 결정합니다. URL 모드를 통해 서브렛 요청을 차단할 수 있을 뿐만 아니라 CSS, JS, 미디어 등 자원을 차단할 수 있습니다.그러나 URL을 매핑하는 방식은 분명 불편합니다.하나 이상의 서브렛 이름을 매핑할 수 있으며, 서브렛과 일치하는 경우 컨테이너가 해당 서브렛 이름과 일치하는 모든 필터를 찾아 요청에 적용합니다.
다른 요청 발송기 유형에 비추기
서브렛 컨테이너에서 다양한 방법으로 요청을 보낼 수 있습니다.
라벨을 사용할 때 터치됩니다. 원본 요청과 관련이 있지만 내부에서 단독 요청 처리
표준을 사용하거나 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) { }
}