1. 인터셉터 및 필터
Spring Boot에 대해 이야기하기 전에 먼저 필터와 인터셉터를 살펴 보겠습니다. 두 사람은 기능 측면에서 매우 유사하지만 특정 기술 구현에는 여전히 큰 차이가 있습니다. 둘 사이의 차이점을 분석하기 전에 먼저 AOP의 개념을 이해해 봅시다. AOP는 특정 기술이 아니라 프로그래밍 아이디어입니다. 객체 지향 프로그래밍 과정에서 상속 및 다형성을 통해 수직 확장을 쉽게 해결할 수 있습니다. 그러나 모든 서비스 방법에서 트랜잭션을 활성화하거나 통합 된 로깅과 같은 수평 함수의 경우 객체 지향 기능을 해결할 수 없습니다. 따라서 AOP 중심 프로그래밍은 실제로 객체 지향 프로그래밍의 아이디어를 보충합니다. 오늘날 우리가 이야기하고있는 필터와 인터셉터는 측면 지향 프로그래밍의 구체적인 구현입니다. 두 가지의 주요 차이점에는 다음 측면이 포함됩니다.
1. 필터는 서블릿 컨테이너에 따라 달라지며 서블릿 사양의 일부입니다. 인터셉터는 독립적으로 존재하며 어떤 상황에서도 사용할 수 있습니다.
2. 필터 실행은 서블릿 컨테이너 콜백에 의해 완료되며 인터셉터는 일반적으로 동적 프록시를 통해 실행됩니다.
3. 필터의 수명주기는 서블릿 컨테이너에 의해 관리되는 반면 인터셉터는 IOC 컨테이너를 통해 관리 할 수 있습니다. 따라서, 다른 콩의 인스턴스는 주입 및 기타 방법을 통해 얻을 수 있으므로 사용하기에 더 편리합니다.
2. 필터 구성
이제 필터를 사용하여 요청의 실행 시간을 기록하는 기능을 실현하며 다음과 같이 구현됩니다.
공개 클래스 로그 코스트 필터는 필터를 구현 {@override public void init (FilterConfig FilterConfig) servleTexception {} @Override public void dofilter (servletRequest servletRequest, servletResponse servletResponse, filterchain filterchain), servletex (long stured); filterchain.dofilter (servletrequest, servletresponse); System.out.println ( "Execute Cost ="+(System.CurrentTimeMillis () -Start)); } @override public void destroy () {}}이 코드의 논리는 비교적 간단합니다. 메소드가 실행되기 전에 타임 스탬프를 기록한 다음 필터 체인을 통해 요청의 실행을 완료하고 반환 된 결과 사이의 실행 시간을 계산하는 것입니다. 여기서 가장 중요한 것은이 클래스가 필터 클래스를 상속해야한다는 것입니다. 이것은 이전 웹 프로젝트와 다르지 않은 서블릿의 사양입니다. 그러나 필터 클래스를 사용하면 이전 웹 프로젝트를 web.xml에서 구성 할 수 있지만 Spring Boot 프로젝트에는 Web.xml 파일이 없으므로 구성 방법은 무엇입니까? Spring Boot에서는 구성을 완료하려면 FilterRegistrationBean이 필요합니다. 구현 프로세스는 다음과 같습니다.
@ConfigurationPublic Class FilterConfig {@Bean Public FilterRegistrationBean registrationFilter () {FilterRegistrationBean Registration = New FilterRegistrationBean (); rightration.setfilter (new logcostfilter ()); 등록 .addurlpatterns ( "/*"); 등록 .setName ( "logcostFilter"); 등록. 세터 (1); 반품 등록; }}이 구성이 완료되었습니다. 구성 해야하는 옵션에는 주로 필터 클래스 인스턴스화, URL의 일치 패턴을 지정하고 필터 이름 및 실행 순서를 설정하는 것이 포함됩니다. 이 프로세스는 실제로 web.xml의 구성과 다르지 않지만 양식은 다릅니다. 이제 URL에 액세스하기 위해 서버를 시작할 수 있습니다.
위의 구성이 적용되었음을 알 수 있습니다. FilterRegistrationBean을 통한 구성 외에도 주석을 통해 직접 완료 할 수있는보다 직접적인 방법도 있습니다.
@WebFilter (urlpatterns = "/*", filtername = "logfilter2") public class logcostfilter2 implements 필터 {@override public void init (filterconfig filterconfig) servletexception {} @override public void dofilter (servletrequest, servletrone servletrec, servletrrongrone servletr) FilterChain)은 ioException, servleTeXception {long start = system.currentTimeMillis (); filterchain.dofilter (servletrequest, servletresponse); System.out.println ( "logfilter2 Execute Cost =" + (System.CurrentTimeMillis () - 시작); } @override public void destroy () {}}여기에서 @webfilter로 직접 구성 할 수 있습니다. 마찬가지로 URL 매칭 모드, 필터 이름 등을 설정할 수 있습니다. 여기서 주목해야 할 것은 주석 @WebFilter가 Servlet 3.0의 사양이며 Spring Boot에서 제공하지 않는다는 것입니다. 이 주석 외에도 구성 클래스에 다른 주석을 추가해야합니다 : @servletcomponetscan, 스캔 된 패키지를 지정합니다.
@springbootApplication@mapperscan ( "com.pandy.blog.dao")@servletcomponentscan ( "com.pandy.blog.filters") 공개 클래스 응용 프로그램 {public static void main (String [] args)은 예외 {springApplication.run (application.class, argss); }} 이제 URL을 다시 방문합시다.
보시다시피, 우리가 구성한 두 필터가 적용되었습니다. 신중한 독자는 우리가 두 번째 필터의 실행 순서를 지정하지 않고 첫 번째 필터 전에 실행한다는 것을 알게 될 것입니다. @webfilter 주석이 실행 순서 속성을 지정하지 않는다는 점을 설명해야합니다. 실행 순서는 필터의 이름에 따라 달라지며 필터 클래스 이름의 알파벳 순서에 따라 역 순서로 정렬됩니다 (구성 필터의 이름이 아님). @WebFilter로 지정된 필터 우선 순위는 FilterRegistrationBean에 의해 구성된 필터보다 높습니다. 관심있는 친구들은 스스로 실험 할 수 있습니다.
3. 인터셉터 구성
우리는 이미 위의 필터 구성 방법을 도입했습니다. 다음으로 인터셉터를 구성하는 방법을 살펴 보겠습니다. 인터셉터를 사용하여 위의 동일한 함수를 구현하여 요청의 실행 시간을 기록합니다. 먼저 인터셉터 클래스를 구현합니다.
공개 클래스 로그 코스 테이너 셉터는 핸들러 interceptor {long start = System.CurrentTimeMillis (); @override public boolean prehandle (httpservletrequest httpservletrequest, httpservletResponse httpservletResponse, Object o) 예외 {start = system.currenttimeMillis (); 진실을 반환하십시오. } @override public void posthandle (httpservletrequest, httpservletrequest, httpservletrepronse httpservletreponse httpservletresponse, modelandview modelandview) 예외 {system.out.println ( "interceptor cost ="+(system.currenttimemillis ()-시작); } @override public void afthcompletion (httpservletrequest httpservletrequest, httpservletrepponse httpservletresponse, object o, exception e) 예외 {}} 던지기여기서 핸들러 인터셉터 인터페이스를 구현해야합니다. 이 인터페이스에는 세 가지 방법이 포함되어 있습니다. 사전 핸들은 요청이 실행되기 전에 실행되며 요청이 실행 된 후에는 Posthandler가 실행되지만 사전 처리 메소드가 True가 반환되는 경우에만 실행됩니다. 뷰 렌더링이 완료된 후에 후속 조치가 실행됩니다. 사전 핸들도 True를 반환해야합니다. 이 방법은 일반적으로 자원 및 기타 작업을 청소하는 데 사용됩니다. 위의 인터페이스를 구현하는 것 외에도 다음을 구성해야합니다.
@ConfigurationPublic Class InterceptorConfig 확장 webmvcconfigureradapter {@override public void addinterceptors (interceptorregistry registry) {registry.addinterceptor (new logcostinterceptor ()). AddPathPatterns ( "/**"); super.addinternceptors (레지스트리); }}여기서 우리는 WebMvcConfigurerAdapter를 물려 받았습니다. 이전 기사를 읽은 친구들은이 수업을 보았을 것입니다. 정적 리소스 디렉토리를 구성 할 때이 클래스를 사용했습니다. 여기서 인터셉터를 구성하기 위해 AddInterceptors 메소드를 다시 작성했습니다. 두 가지 주요 구성 항목이 있습니다. 하나는 인터셉터를 지정하고 다른 하나는 인터셉터 URL을 지정하는 것입니다. 이제 시스템을 시작하고 모든 URL에 액세스합니다.
보시다시피, 우리는 인터셉터를 통해 동일한 기능을 달성했습니다. 그러나 사전 핸들과 사전이 두 가지 방법이기 때문에이 구현이 실제로 문제가된다는 점에 유의해야하므로 시작 값을 저장하기 위해 공유 변수 시작을 설정해야하지만 스레드 안전 문제가 발생합니다. 물론, 우리는 잘 해결 될 수있는 ThreadLocal과 같은 다른 방법을 통해이 문제를 해결할 수 있으며 관심있는 학생들은 스스로 구현할 수 있습니다. 그러나이를 통해 우리는 실제로 인터셉터가 많은 시나리오에서 필터보다 낫지만이 시나리오에서는 필터가 인터셉터보다 구현하기가 더 간단하다는 것을 알 수 있습니다.
4. 요약
이 기사는 주로 스프링 부팅을 기반으로 필터 및 인터셉터의 구성을 설명합니다. 필터와 인터셉터는 AOP (섹션 지향 프로그래밍) 아이디어의 특정 구현에 속합니다. 이 두 구현 외에도, 우리는 측면을 통해 점점 더 강력한 기능을 완료 할 수있는 또 다른 유연한 AOP 구현 기술, 즉 측면을 보았습니다. 나중에 이것을 공유하겠습니다.