>  기사  >  Java  >  Spring 인터셉터의 구현 원리 살펴보기

Spring 인터셉터의 구현 원리 살펴보기

王林
王林원래의
2024-01-11 15:18:23655검색

Spring 인터셉터의 구현 원리 살펴보기

스프링 인터셉터의 구현 메커니즘 공개

소개

웹 애플리케이션을 개발할 때 요청이 컨트롤러에 도달하기 전이나 후에 특정 작업을 수행해야 하는 경우가 많습니다. 예를 들어 사용자 인증, 로그 기록, 예외 처리 등이 있습니다. Spring 프레임워크는 이러한 작업을 구현하기 위한 인터셉터(인터셉터)를 제공합니다. 인터셉터는 요청과 응답을 사전 처리하고 사후 처리할 수 있습니다.

이 글에서는 Spring 인터셉터의 구현 메커니즘을 살펴보겠습니다. 인터셉터가 무엇인지, 어떻게 작동하는지 이해하고 특정 코드 예제를 통해 사용자 정의 인터셉터를 구현하는 방법을 보여줍니다.

인터셉터의 개념

인터셉터는 요청 전처리 및 후처리를 위한 Spring 프레임워크의 메커니즘입니다. 서블릿의 필터와 유사하지만 필터와 달리 인터셉터는 메소드 수준을 기반으로 합니다. 지정된 컨트롤러의 메서드를 가로채고 메서드 실행 전후에 사용자 지정 논리를 실행할 수 있습니다. 인터셉터는 비즈니스 논리와 관련이 없는 일부 일반 처리를 구현하고 코드 재사용성과 유지 관리성을 향상시키는 데 도움이 될 수 있습니다.

인터셉터 작동 방식

인셉터는 AOP(Aspect Oriented 프로그래밍)를 통해 구현됩니다. Spring 인터셉터는 preHandle, postHandle 및 afterCompletion의 세 가지 메소드를 정의하는 HandlerInterceptor 인터페이스를 기반으로 합니다. 구체적인 작업 흐름은 다음과 같습니다.

  1. 클라이언트가 DispatcherServlet에 요청을 보내면 DispatcherServlet은 요청된 URL을 기반으로 해당 HandlerMapping을 찾아 해당 HandlerExecutionChain을 가져옵니다.
  2. HandlerExecutionChain에는 일련의 HandlerInterceptor가 포함되어 있습니다.
  3. DispatcherServlet은 각 인터셉터의 preHandle 메소드를 차례로 호출하고 메소드의 반환 값을 확인합니다.

    • true가 반환되면 요청 처리가 계속되고 다음 인터셉터의 preHandle 메서드에 들어갑니다.
    • false가 반환되면 요청은 여기서 중단되고 클라이언트로 반환됩니다.
  4. 모든 인터셉터의 preHandle 메소드가 true를 반환하면 DispatcherServlet은 HandlerExecutionChain에 있는 Handler 객체의 handlerRequest 메소드를 호출합니다.
  5. HandlerExecutionChain의 Handler 개체는 비즈니스 논리를 실행하고 ModelAndView를 반환합니다.
  6. DispatcherServlet은 각 인터셉터의 postHandle 메서드를 차례로 호출하고 ModelAndView를 전달합니다.
  7. 인셉터의 postHandle 메소드는 ModelAndView를 수정하고 향상시킬 수 있습니다.
  8. DispatcherServlet은 뷰 구문 분석 및 렌더링을 위해 ModelAndView를 ViewResolver에 전달합니다.
  9. 뷰가 렌더링된 후 DispatcherServlet은 각 인터셉터의 afterCompletion 메서드를 차례로 호출하여 일부 리소스를 추가로 정리합니다.

사용자 정의 인터셉터 구현

다음에서는 특정 예를 사용하여 사용자 정의 인터셉터를 구현하는 방법을 보여줍니다.

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //  在方法执行之前进行逻辑处理
        System.out.println("拦截器preHandle方法执行");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 在方法执行之后进行逻辑处理
        System.out.println("拦截器postHandle方法执行");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 在视图渲染完成后进行逻辑处理
        System.out.println("拦截器afterCompletion方法执行");
    }
}

위 코드에서는 HandlerInterceptor 인터페이스를 구현하고 해당 메서드 세 개를 재정의했습니다. preHandle 메서드에서 일부 사전 처리를 수행할 수 있고, postHandle 메서드에서 ModelAndView를 수정 및 향상할 수 있으며, afterCompletion 메서드에서 일부 리소스 정리 작업을 수행할 수 있습니다.

다음으로 Spring 컨테이너에 사용자 정의 인터셉터를 구성해야 합니다. 이는 XML 구성이나 주석을 통해 달성할 수 있습니다.

XML 구성 방법

Spring 구성 파일에 다음 구성을 추가합니다.

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**" />
        <mvc:exclude-mapping path="/login" />
        <bean class="com.example.MyInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

위 구성에서는 <interceptor></interceptor> 태그를 사용하여 인터셉터를 정의하고 태그는 가로챌 URL 경로를 지정합니다. 가로챌 필요가 없는 일부 URL 경로를 제외하려면 <exclude-mapping></exclude-mapping> 태그를 사용하세요. <interceptor></interceptor>标签来定义拦截器,并通过<mapping></mapping>标签指定要拦截的URL路径。使用<exclude-mapping></exclude-mapping>标签来排除一些不需要拦截的URL路径。

注解方式配置拦截器

在拦截器类上添加@Component注解,并使用@Order

주석을 사용하여 인터셉터를 구성하세요

인터셉터 클래스에 @Component 주석을 추가하고 @Order 주석을 사용하여 인터셉터의 실행 순서를 지정하세요.

@Component
@Order(1)
public class MyInterceptor implements HandlerInterceptor {
    // 省略代码
}

Spring의 구성 클래스에 다음 구성을 추가합니다.

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private MyInterceptor myInterceptor;
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
    }
}

위 구성에서는 WebMvcConfigurer 인터페이스를 구현하고 그 안에 addInterceptors 메서드를 다시 작성하여 인터셉터 레지스트리에 인터셉터를 추가합니다.

결론🎜🎜이 글을 통해 Spring 인터셉터의 개념과 작동 원리를 이해했으며, 구체적인 코드 예제를 통해 커스텀 인터셉터를 구현하는 방법을 시연했습니다. 인터셉터는 Spring 프레임워크의 매우 중요한 기능으로, 몇 가지 공통 처리 로직을 구현하고 코드 재사용성과 유지 관리성을 향상시키는 데 도움이 됩니다. 이 기사가 Spring 인터셉터를 이해하는 데 도움이 되었기를 바랍니다. 🎜

위 내용은 Spring 인터셉터의 구현 원리 살펴보기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.