스프링 인터셉터의 구현 메커니즘 공개
웹 애플리케이션을 개발할 때 요청이 컨트롤러에 도달하기 전이나 후에 특정 작업을 수행해야 하는 경우가 많습니다. 예를 들어 사용자 인증, 로그 기록, 예외 처리 등이 있습니다. Spring 프레임워크는 이러한 작업을 구현하기 위한 인터셉터(인터셉터)를 제공합니다. 인터셉터는 요청과 응답을 사전 처리하고 사후 처리할 수 있습니다.
이 글에서는 Spring 인터셉터의 구현 메커니즘을 살펴보겠습니다. 인터셉터가 무엇인지, 어떻게 작동하는지 이해하고 특정 코드 예제를 통해 사용자 정의 인터셉터를 구현하는 방법을 보여줍니다.
인터셉터는 요청 전처리 및 후처리를 위한 Spring 프레임워크의 메커니즘입니다. 서블릿의 필터와 유사하지만 필터와 달리 인터셉터는 메소드 수준을 기반으로 합니다. 지정된 컨트롤러의 메서드를 가로채고 메서드 실행 전후에 사용자 지정 논리를 실행할 수 있습니다. 인터셉터는 비즈니스 논리와 관련이 없는 일부 일반 처리를 구현하고 코드 재사용성과 유지 관리성을 향상시키는 데 도움이 될 수 있습니다.
인셉터는 AOP(Aspect Oriented 프로그래밍)를 통해 구현됩니다. Spring 인터셉터는 preHandle, postHandle 및 afterCompletion의 세 가지 메소드를 정의하는 HandlerInterceptor 인터페이스를 기반으로 합니다. 구체적인 작업 흐름은 다음과 같습니다.
DispatcherServlet은 각 인터셉터의 preHandle 메소드를 차례로 호출하고 메소드의 반환 값을 확인합니다.
다음에서는 특정 예를 사용하여 사용자 정의 인터셉터를 구현하는 방법을 보여줍니다.
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 구성이나 주석을 통해 달성할 수 있습니다.
Spring 구성 파일에 다음 구성을 추가합니다.
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <mvc:exclude-mapping path="/login" /> <bean class="com.example.MyInterceptor" /> </mvc:interceptor> </mvc:interceptors>
위 구성에서는 <interceptor></interceptor>
태그를 사용하여 인터셉터를 정의하고 <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"); } }
위 내용은 Spring 인터셉터의 구현 원리 살펴보기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!