package hello.login.web.interceptor;
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();
if (session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) {
log.info("미인증 사용자 요청");
//로그인으로 redirect
response.sendRedirect("/login?redirectURL=" + requestURI);
return false;
}
return true;
}
}
비로그인 사용자의 경우 -> return false;
로그인 사용자의 경우 -> return true;
Filter 구현 때와 달리 따로 whitelist URL 들을 만들어서 관리할 필요가 없다. 왜냐하면 해당 작업은 있다가 Config 파일에 등록할 때 같이 적용 시킬것이기 때문이다.
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 다른 인터셉터 등록
registry.addInterceptor(...)
// 로그인 체크 인터셉터 등록
registry.addInterceptor(new LoginCheckInterceptor())
.order(2)
.addPathPatterns("/**")
.excludePathPatterns("/", "/members/add", "/login", "/logout",
"/css/**", "/*.ico", "/error");
}
Filter 와 달리 @Bean 을 등록하는게 아니고 addInterceptor() 를 오버라이드 한다.
그래서 인터셉터마다 빈 한개씩 생성하는게 아닌, addInterceptor() 가 전달받는 파라미터인 registry 에 하나씩 등록하게된다.
Filter 또 다른 점이다. 앞에서 언급했듯이 Interceptor 가 URL을 관리하지 않고 WebConfig 파일 안에서 관리하게된다.
또한 Filter 보다 훨씬 세밀하게 URL 을 관리할 수있다.
PathPatern 공식문서 에 가면 더 자세히 알 수 있다.
Filter 보다 Interceptor 가 훨씬 기능이 많으므로 반드시 필터를 쓸일이 아니라면 그냥 인터셉터를 사용하자!
본 포스트는
김영한의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 강의 를 보고 정리했습니다.