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가 동작하지 않는다.)
'SPRING BOOT' 카테고리의 다른 글
[스프링부트_Spring Boot] 에러 페이지 설정(Custom Error Page) (1) | 2023.10.26 |
---|