[Spring Boot] 인터셉터 / Interceptor / 로그인 여부 체크하기

seulki·2022년 12월 1일
0

[springboot]

목록 보기
19/27

🎈 인터셉터

  • 스프링 인터셉터도 서블릿 필터와 같이 웹과 관련된 공통 관심 사항을 효과적으로 해결할 수 있는 기술이다.
    서블릿 필터서블릿이 제공하는 기술이라면, 스프링 인터셉터스프링 MVC 가 제공하는 기술이다.
  • 둘다 웹과 관련된 공통 관심 사항을 처리하지만, 적용되는 순서와 범위, 그리고 사용방법이 다르다.
  • HTTP요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러
  • 스프링 인터셉터디스패처 서블릿컨트롤러 사이에서 컨트롤러 호출 직전에 호출된다.
  • 스프링 인터셉터스프링 MVC가 제공하는 기능이기 때문에 결국 디스패처 서블릿 이후에 등장하게 된다.
  • 정밀한 URL 패턴을 적용할 수 있다.

  • Handler Interceptor 인터페이스 사용
    - 컨트롤러 호출 전 : preHandle
    - 컨트롤러 호출 후 : postHandle
    - 요청 완료 이후 : afterCompletion, 뷰가 렌더링 된 이후에 호출된다.



🎈 로그인 여부 체크 필요

  • 로그인한 사용자만 볼 수 있는 페이지들의 접근을 막을 필요가 있다.
  • 여러 기능에서 로그인 여부를 체크해야한다면 공통 로직이 필요하다.


👌 인터셉터 클래스 생성

  • LogInterceptor.java
public class LogInterceptor implements HandlerInterceptor{

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		String requestURI = request.getRequestURI();
		System.out.println("[interceptor] requestURI : " + requestURI);
		
		return true;  // false -> 이후에 진행을 하지 않는다.
	}
	
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("[interceptor] postHandle");
	}
	
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("[interceptor] afterCompletion");
	}


  • LoginCheckInterceptor.java -> 로그인 여부 체크 인터셉터
public class LoginCheckInterceptor implements HandlerInterceptor{

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

		String requestURI = request.getRequestURI();
		System.out.println("[interceptor] : " + requestURI);
		HttpSession session = request.getSession(false);
		
		if(session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) {
       		// 로그인 되지 않음
			System.out.println("[미인증 사용자 요청]");
			
			//로그인으로 redirect
			response.sendRedirect("/login?redirectURL=" + requestURI);
			return false;
		}
        // 로그인 되어있을 떄
		return true;
	}
}


✨ 인터셉터 등록하기

  • WebMvcConfigurer 인터페이스 상속받기
  • order() : 인터셉트의 호출 순서를 지정한다. 낮을 수록 먼저 호출된다.
  • addPathPatterns("/**") : 인터셉터를 적용할 URL 패턴을 지정한다.
  • excludePathPatterns("/error") : 인터셉터에서 제외한 패턴을 지정한다.

  • url 패턴
    -addPathPatterns("/sub1/test1", "/sub1/test2")
    -1개의 "어떠한" 경로에 상관없이 쓰려면 -> /sub1/*
    -1개를 넘어서서 몇개의 어디든지의 경로에 추가하고 싶으면 -> sub1/**

  • WebConfig.java
@Component
public class WebConfig implements WebMvcConfigurer{
	
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(new LogInterceptor()) // LogInterceptor 등록
				.order(1)	// 적용할 필터 순서 설정
				.addPathPatterns("/**")
				.excludePathPatterns("/error"); // 인터셉터에서 제외할 패턴
		
		registry.addInterceptor(new LoginCheckInterceptor()) //LoginCheckInterceptor 등록
				.order(2)
				.addPathPatterns("/**")
				.excludePathPatterns("/", "/members/add", "/login", "/logout", "/css/**");
	}
  }
profile
웹 개발자 공부 중

0개의 댓글