컨트롤러의 핸들러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는, 일종의 필터이다.
로그인 된 계정만 실행 가능한 Controller 핸들러를 작성한다고 가정하자.
그럼 우리는 계정이 로그인 되었는지를 확인하는 세션 검증 코드를 해당하는 모든 핸들러에 각각 작성해야 한다.
핸들러가 많아질수록 서버의 부하가 늘어나고, 실수로 세션 검증을 적용하지 않은 핸들러가 생기는 누락의 문제가 발생할 수도 있다.
이 때 스프링이 제공하는 인터셉터를 이용하면, 한 번의 작성으로 여러 컨트롤러에 세밀하게 접근하는 것을 가능케 한다.
인터셉터를 적용하기 위한 큰 틀은 다음과 같다.
1. HandlerInterceptor 인터페이스 상속받은 클래스에서 원하는 로직을 구현한다.
2. WebMvcConfigurer 를 상속받은 Config 파일에 Bean 등록을 하고, 인터셉터 및 인터셉터를 적용할 url을 추가한다.
로그인을 한 사람만 페이지 접속이 가능하도록 인증 체크 기능을 인터셉터로 개발해보자.
import hello.login.web.SessionConst;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
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 {
String requestURI = request.getRequestURI(); log.info("인증 체크 인터셉터 실행 {}", requestURI);
HttpSession session = request.getSession(false);
if (session == null || session.getAttribute(SessionConst.LOGIN_MEMBER)
== null) {
log.info("미인증 사용자 요청");
//로그인으로 redirect
response.sendRedirect("/login?redirectURL=" + requestURI);
return false;
}
return true;
}
}
참고
1. 김영한님 Spring MVC2 강의
2. https://popo015.tistory.com/115