Programing/Springboot

spring boot 2.x interceptor setting 스프링부트 인터셉터 등록 방법

리커니 2020. 7. 14. 10:52
반응형

spring boot 2.x interceptor setting 스프링부트 인터셉터 등록 방법

 

이번 포스팅에서는 spring boot 프로젝트에 인터셉터를 등록하는 방법을 알아보겠습니다. 

 

간단히 순서만 우선 말씀드리면, 

1. HandlerInterceptorAdapter extends 받은 실제 interceptor 구현 class 생성.

2. WebMvcConfigurer을 implements 받은 WebMvcConfig class 생성 후 1의 interceptor 등록.

의 순 입니다.

 

※ 2021.12.15 추가

Spring 버전 때문에 HandlerInterceptorAdaptor 가 deprecated 되었다면 (취소선) HandlerInterceptor 를 implements 하도록 합니다. 나머지 내용은 같습니다.

 

그럼 위의 순서대로 코드를 구현해보도록 하죠.

 

[LoginInterceptor class]

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

import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

@Configuration
public class LoginInterceptor extends HandlerInterceptorAdapter{
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
		System.out.println("Interceptor");
		Authentication auth = SecurityContextHolder.getContext().getAuthentication();
		if(auth.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_USER"))) {
			System.out.println("사용자");
		}else if(auth.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_ADMIN"))) {
			System.out.println("관리자");
		}
        return super.preHandle(request, response, handler);
    }
}

 

LoginInterceptor class를 생성 후 HandlerInterceptorAdapter를 extends 합니다.

 

HandlerInterceptorAdapter를 상속받게되면 preHandle, postHandle, afterComplete 메소드를 Override 하여 사용할 수 있습니다. 

 

preHandle : 메서드 컨트롤러 실행 전 수행

postHandle : 메서드 컨트롤러 실행 후 수행

afterComplete : 모든 로직 실행 후 수행

 

위의 샘플 코드는 spring security 가 적용된 프로젝트에서 로그인 전에 사용자인지 관리자인지 구분하는 로직입니다.

실제 작동할 인터셉터는 구현하였고, 이제 등록을 하도록 합니다.

 

[WebMvcConfig class]

 

import org.springframework.beans.factory.annotation.Autowired;

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

import kr.co.neighbor21.CITS_ARCH.login.LoginInterceptor;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer{
	
	@Autowired
	private LoginInterceptor interceptor;

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(interceptor)
			.addPathPatterns("/")
			.addPathPatterns("/member/*")
			.addPathPatterns("/admin/*")
			.excludePathPatterns("/login");
	}
}

 

WebMvcConfig class를 생성하여 WebMvcConfigurer 를 implements 합니다.

그리고 addInterceptors 메소드를 오버라이드 하여 이전에 작성한 interceptor를 추가해줍니다.

addPathPatterns는 말그대로 인터셉터가 동작할 url 패턴,

excludePathPatterns는 인터셉터가 동작하지 않을 url 패턴입니다.

 

이렇게 구현을 하게 되면, 등록한 url 패턴 전에 해당 interceptor가 동작을 하게 됩니다.

반응형