[Spring Boot] 인터셉터(Interceptor) 사용하기

Posted by 김성철

스프링 부트 - 인터셉터 사용하기

https://eastglow.github.io/back-end/2019/08/01/Spring-Interceptor-%EC%82%AC%EC%9A%A9-%EC%8B%9C-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85%EC%9D%B4-%EC%95%88%EB%90%98%EB%8A%94-%EA%B2%BD%EC%9A%B0.html  

인터셉터 클래스를 생성

HandlerInterceptor 를 구현  
  
=====================================================================================================================================================  
  
package com.securus.ciim.main.interceptor;  
  
import lombok.extern.slf4j.Slf4j;  
import org.springframework.stereotype.Component;  
import org.springframework.util.StringUtils;  
import org.springframework.web.servlet.HandlerInterceptor;  
import org.springframework.web.servlet.ModelAndView;  
  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import javax.servlet.http.HttpSession;  
  
@Slf4j  
@Component  
public class LoginCheckInterceptor implements HandlerInterceptor {  
	@Override  
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {  
		boolean loginCheck =false;  
		HttpSession session = request.getSession();  
  
		if(!StringUtils.isEmpty(session.getAttribute("loginCheck"))){  
			if(session.getAttribute("loginCheck").equals("success")){  
				loginCheck = true;  
  
			}else{  
				response.sendRedirect("/");  
				session.invalidate();  
			}  
		}else{  
			response.sendRedirect("/");  
			session.invalidate();  
		}  
		log.info("#### LoginCheckInterceptor loginCheck : {}",loginCheck );  
		return loginCheck;  
	}  
  
	@Override  
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {  
  
	}  
  
	@Override  
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception arg3) throws Exception {  
  
	}  
}  
  
=====================================================================================================================================================  

config 클래스를 생성하여 인터페이스를 사용하도록 수정

addPathPatterns() 를 통해서 패턴을 추가할 수 있음  
excludePathPatterns() 를 통해서 예외 패턴을 추가할 수 있음  
excludePathPatterns는 스트링과 리스트를 넣을 수 있음, 리스트의 경우에는 리스트 안에 있는 목록이 전부다 예외처리됨  
  
=====================================================================================================================================================  
  
package com.securus.ciim.configuration;  
  
import com.securus.ciim.main.interceptor.LoginCheckInterceptor;  
import lombok.AllArgsConstructor;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;  
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;  
  
@AllArgsConstructor  
@Configuration  
public class InterceptorConfig extends WebMvcConfigurerAdapter {  
  
	LoginCheckInterceptor loginCheckInterceptor;  
  
	@Override  
	public void addInterceptors(InterceptorRegistry registry) {  
		registry.addInterceptor(loginCheckInterceptor)  
				.addPathPatterns("/user/*")  
				.addPathPatterns("/log/*")  
				.excludePathPatterns("/");  
	}  
}  
  
=====================================================================================================================================================  

Service 가 호출이 안되는경우

위의 로직과 같이 @Component를 사용하고 인터셉터에서 "LoginCheckInterceptor loginCheckInterceptor" 로 사용하면 잘되지만  
new LoginCheckInterceptor 를 해서 사용할 경우 안될수가 있음  
  
그럴때에는 아래와 같이 @Bean 어노테이션을 사용하고, 인터셉터클래스 위에 @Component 어노테이션을 지워주면 됨  
registry.addInterceptor(loginCheckInterceptor) 이부분을 아래와같이 사용하면 스프링에서 관리를 하지못해 서비스레이어를 불러오지 못함  
registry.addInterceptor(new LoginCheckInterceptor())  
  
@Bean 어노테이션을 사용하여서 LoginCheckInterceptor 를 생성해주는 메소드를 만들고,  
상단부에서 전역변수로 선언한 부분을 삭제 ( 	LoginCheckInterceptor loginCheckInterceptor; ) 이부분  
  
=================================================================================================================  
package com.securus.ciim.configuration;  
  
import com.securus.ciim.main.interceptor.LoginCheckInterceptor;  
import lombok.AllArgsConstructor;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;  
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;  
  
@AllArgsConstructor  
@Configuration  
public class InterceptorConfig extends WebMvcConfigurerAdapter {  
  
	@Override  
	public void addInterceptors(InterceptorRegistry registry) {  
		registry.addInterceptor(loginCheckInterceptor)  
				.addPathPatterns("/user/*")  
				.addPathPatterns("/log/*")  
				.excludePathPatterns("/");  
	}  
  
	@Bean  
	public LoginCheckInterceptor loginCheckInterceptor(){  
  
		return new LoginCheckInterceptor();  
	}  
}  
  
=================================================================================================================  
  
위의 소스와 똑같지만 @Component 어노테이션을 지움  
=====================================================================================================================================================  
  
package com.securus.ciim.main.interceptor;  
  
import lombok.extern.slf4j.Slf4j;  
import org.springframework.stereotype.Component;  
import org.springframework.util.StringUtils;  
import org.springframework.web.servlet.HandlerInterceptor;  
import org.springframework.web.servlet.ModelAndView;  
  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import javax.servlet.http.HttpSession;  
  
@Slf4j  
public class LoginCheckInterceptor implements HandlerInterceptor {  
	@Override  
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {  
		boolean loginCheck =false;  
		HttpSession session = request.getSession();  
  
		if(!StringUtils.isEmpty(session.getAttribute("loginCheck"))){  
			if(session.getAttribute("loginCheck").equals("success")){  
				loginCheck = true;  
  
			}else{  
				response.sendRedirect("/");  
				session.invalidate();  
			}  
		}else{  
			response.sendRedirect("/");  
			session.invalidate();  
		}  
		log.info("#### LoginCheckInterceptor loginCheck : {}",loginCheck );  
		return loginCheck;  
	}  
  
	@Override  
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {  
  
	}  
  
	@Override  
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception arg3) throws Exception {  
  
	}  
}  
  
=====================================================================================================================================================  

리턴값을 화면단으로 상태값을 돌려줘야 하는 경우

preHandle 메소드에서 response 객체에 상태값을 담아주면 됨  
  
=====================================================================================================================================================  
  
package com.securus.ciim.main.interceptor;  
  
import lombok.extern.slf4j.Slf4j;  
import org.springframework.stereotype.Component;  
import org.springframework.util.StringUtils;  
import org.springframework.web.servlet.HandlerInterceptor;  
import org.springframework.web.servlet.ModelAndView;  
  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import javax.servlet.http.HttpSession;  
  
@Slf4j  
@Component  
public class LoginCheckInterceptor implements HandlerInterceptor {  
	@Override  
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {  
		boolean loginCheck =false;  
		HttpSession session = request.getSession();  
  
		if(!StringUtils.isEmpty(session.getAttribute("loginCheck"))){  
			if(session.getAttribute("loginCheck").equals("success")){  
				loginCheck = true;  
  
			}else{  
				response.sendRedirect("/");  
				session.invalidate();  
			}  
		}else{  
			response.sendRedirect("/");  
			session.invalidate();  
		}  
		log.info("#### LoginCheckInterceptor loginCheck : {}",loginCheck );  
  
		//화면단에 값 리턴  
		//response.sendError(상태코드,"전달할 문자열");  
		response.sendError(200,"로그인체크");  
  
		//화면단에 값 리턴 종료  
		return loginCheck;  
	}  
  
	@Override  
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {  
  
	}  
  
	@Override  
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception arg3) throws Exception {  
  
	}  
}  
  
=====================================================================================================================================================