본문 바로가기
SPRING BOOT

[스프링부트_Spring Boot] 스프링 인터셉터(Spring Interceptor) 적용하기 (Session 사용 버전)

by NYO_O 2023. 10. 19.
반응형

Interceptor (인터셉터) : 가로채다

 

 

Spring Interceptor (스프링 인터셉터)란?

Controller에 들어오는 요청인 HttpRequest와, Controller가 응답하면 HttpResponse가로채 원하는 동작을 추가할 수 있게 해주는 객체이다.

spring이 제공하는 기술이며 Dispatcher Servlet이 Controller를 호출하기 전/후 요청에 대해 부가적인 작업을 처리할 수 있게 해준다.

 

 

HandlerInterceptor의 구조

 

public interface HandlerInterceptor {

	default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

		return true;
	}
    
    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable ModelAndView modelAndView) throws Exception {
	}
    
    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable Exception ex) throws Exception {
	}
    
}

 

 

preHandle

- Controller 호출 전에 호출된다.

- 반환 값이 true이면 이후 로직을 진행하고, false이면 더 진행하지 않는다.

@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return false;
    }
    
}

해당 코드 작성 후 실행할 경우 LogInterceptor가 적용되는 모든 페이지 접근 시 빈 화얀색 화면만 출력된다.

 

postHandle

- Controller 호출 후에 호출된다. ( 핸들러 어댑터 호출 후에 호출된다. )

- Controller에서 예외가 발생하면 postHandler은 호출되지 않는다.

 

afterCompletion

- View가 렌더링된 이후에 호출된다.

- 예외가 발생하더라도 실행된다. 예외를 파라미터로 받아 어떤 예외가 발생했는지 로그로 출력할 수 있다.

- 예외가 발생하더라도 공통적인 비즈니스 로직 처리가 필요할 경우 afterCompletion( )을 사용한다.

 

 

 

 

 

 

로그인 되어있지 않을 경우 특정 페이지 접근 불가 코드 구현 (인가)

상황

1. Session으로 로그인 처리한 상태

2. /login이 로그인 페이지 경로

 

[1] LoginInterceptor.java 파일 생성하여 HandlerInterceptor의 preHandler( )만 Override 한다.

@Slf4j
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String requestURI = request.getRequestURI();

        HttpSession session = request.getSession();

        if (session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) {
            log.info("로그인되지 않은 상태");
            // 원래 시도한 경로가 아닌 로그인 페이지로 이동 redirect
            response.sendRedirect("/login?redirectURL=" + requestURI);
            return false;
        }

        return true;
    }
}

- 기존에 요청했던 페이지를 저장한다.

- 세션에 정보가 없다면 로그인 페이지로 이동하며 기존에 요청했던 페이지를 전달해준다.

- 세션에 정보가 있다면 기존 로직을 수행한다.

 

 

[2] WebConfig.java 파일을 생성하여 @Configuration 애너테이션을 추가해준다. WebMvcConfigurer에서  addInterceptors(InterceptorRegistry registry)만 Override 한다.

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/", "/회원가입 페이지 경로", "/login", "/logout", "/error");
    }
    
}

- addInterceptor(new LoginInterceptor( ) :  LoginInterceptor( )를 등록해준다.

- addPathPatterns("/**") : LoginInterceptor( )를 실행하게할 URL 설정 (해당 경로로 진입 시 LoginInterceptor가 동작하는 것)

- excludePathPatterns("/", "/회원가입 페이지 경로", "/login", "logout", "/error") : LoginInterceptor( )를 실행하지 않게할 URL 설정 (해당 경로로 진입 시 LoginInterceptor가 동작하지 않는다.)

 

반응형

 

반응형