[SpringMvc] Spring Interceptor 설정하기 (HandlerInterceptor)

2021. 2. 8. 11:08프로그래밍 언어/Spring Framework

[SpringMvc] Spring Interceptor 설정하기 (HandlerInterceptor)

 

1. Interceptor 

특정 URL 진입시 가로채어서 특정 작업을 수행하는것이 Interceptor입니다.
Filter, Interceptor, AOP가 있습니다.

Filter
 * Web Applicaion Context의 기능입니다. J2EE 표준스펙에 정의 되어 있는 기능입니다.
 * DispatherServlet의 앞단에서 들어오는 요청 정보를 처리합니다.
 * 스프링의 기능을 이용하기 어렵습니다.
 * Encoding, XSS 등의 보안 관련 처리는 Web Application 전역적으로 처리할 때 Filter로 구현합니다.

Interceptor
 * Spring Framework에서 자체적으로 제공하는 기능입니다.
 * DispatherServlet과 Controller의 사이에서 동작합니다.
 * 인증, 권한 등의 Detail한 처리는 Interceptor로 구현합니다.

 

 

 


2. HandlerInterceptor 예제

pom.xml

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

 

 

SampleController

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class SampleController {
    @GetMapping()
    public String Sample() {
        log.info("===== Sample Controller =====");
        return "hello";
    }
}

 

 

SampleInterceptor

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Slf4j
public class SampleInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // Controller 실행 전에 수행되는 메소드.
        log.info("===== preHandler START =====");
        log.info("Request URL : {}", request.getRequestURI());
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // Controller 실행 후 View가 랜더링 되기 전에 실행
        log.info("===== preHandler END =====");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // Controller 실행 후 View가 랜더링 된 후에 실행
        log.info("===== after Completion =====");
    }
}

 

1) public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

| Controller 실행 전에 실행되는 메소드 입니다. return 값이 True면 컨트톨러로 진입하고, False일경우 진입하지 않습니다.

Object handler에는 진입하려는 Controller의 class 객체가 있습니다.

 

2) public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)

| Controller 실행 후 View가 랜더링 되기 전에 실행

 

3) public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)

| Controller 실행 후 View가 랜더링 된 후에 실행

 

 

 

WebMvcConfig

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SampleInterceptor());
        
        /*
        // 가로채는 경로 설정 가능
        registry.addInterceptor(new SampleInterceptor())
                .addPathPatterns("/*") // 모든 Path에 대해서 가로챌것이다.
                // .addPathPatterns("/sample") // /sample경로에 대해서만 가로챌것이다.
                .excludePathPatterns("/sample"); // /sample 경로에 대해서는 Interceptor 가로채지 않을것이다.
        */
    }
}

| Interceptor를 Bean으로 등록하여 사용합니다.

InterceptorRegistry에 addInterceptor하며 등록후, 체이닝 방식을 통해 세부적으로 가로챌 경로와 가로채지 않을 경로를 설정할 수 있습니다.

 

 

 

 

실행 결과

| Controller가 실행되기 전에 SampleInterceptor의 START가 실행이 되었습니다. 경로는 "/" 입니다.

그다음 Controller가 실행이 되고 다시 SampleInterceptor의 END가 실행이 되는것을 보실 수 있습니다.

 

 

 

 

 

 

더보기

| 참고

갓대희 : goddaehee.tistory.com/154

linked2ev : linked2ev.github.io/