Interceptor란?
Interceptor는 요청을 가로채는 작업을 의미합니다. 즉, 사용자의 요청이 Controller에 가기 전에 가로채고, 서버의 응답이 사용자에게 가기 전에 가로챕니다.
좀 더 풀어보자면, 해당 URL 요청이 MAIN ACTION 요청이 있을 때 우선 선 처리로 갔다가 세션이 없으면 즉, false면 로그인 페이지로 보내고, true면 정상적으로 MAIN ACTION으로 이동합니다.
선 처리, 후 처리는 어떤 역할을 할까??
선 처리 : 세션 체크 해서 세션이 없으면 로그인 페이지로 보내고 세션이 있으면 정상적으로 URL 확장자로 간다.
후 처리 : 세션 체크는 후 처리할 내용이 없기 때문에 단지 추상 메서드 오버라이딩 처리만 해둔다.
그럼 중간에 가로채는 작업이면 실행 순서는 어떻게 흘러갈까요??
아래 사진을 참고해 봅니다.
실행 순서
Filter > DispatcherServlet > Interceptor > AOP
== 웹서버에서의 처리 순서 ==
login.do => Filter => DispatcherServlet => Interceptor
1) Filter - 선처리만
2) DispatcherServlet
3) Interceptor - url 기반 (전후처리)
4) AOP - 코드에 기반, @Before(전처리), @After(후처리), @Around(전후처리)
환경설정
Interceptor를 사용하려면 URL mapping 처리를 해줘야 합니다.
( 이전 포스팅에서 코드 작업했던 파일을 mapping 처리 했습니다.)
위 사진은 Spring Servlet 설정 파일입니다. class로 각 클래스의 경로를 설정해 주고 설정한 자바 클래스는 모든 요청을 가로챌 수 있습니다.
또한 Interceptor 사용할 파일 경로들도 mapping 시켜줍니다.
예제로는 세 개의 클래스 중에 관리자 페이지로 알아봅시다.
Logininterceptor.java
Interceptor를 지원하기 위해서는 두 가지 방법이 있습니다.
HandlerInterceptor - 인터페이스
HandlerInterceptorAdapter - 추상 클래스
아래의 추상 클래스는 위의 인터페이스를 사용하기 쉽게 구현해 놓은 추상 클래스입니다.
예제 코드로는 추상 클래스를 활용합니다.
package com.example.spring.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class AdminInterceptor extends HandlerInterceptorAdapter {
// 선처리
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
HttpSession session=request.getSession();
if(session.getAttribute("admin_userid")==null) { // MAIN ACTION 페이지로 이동 안됨
//관리자 로그인 페이지로 이동
response.sendRedirect(request.getContextPath()
+"/admin/login.do?message=nologin");
return false;
}else {
return true;
}
}
// 후처리
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);
}
}
처음에 말씀드린 것처럼 선처리, 후처리를 해줘야 합니다.
HandlerInterceptorAdapter는 3가지의 메서드를 제공합니다.
preHandle - Controller에 요청이 들어가기 전에 수행합니다. (선 처리)
postHandle - Controller의 메서드의 처리가 끝나 return 되고 화면을 띄워주는 처리가 되기 직전에 메서드가 수행됩니다. (후 처리)
afterCompletion - Controller가 수행되고 화면 처리까지 끝난 뒤 호출됩니다.
위 코드를 보면 ID가 NULL 이면 MAIN ACTION으로 넘어가지 않고 로그인 페이지로 넘어가면서 메시지로 안내해 줍니다.
출력
< Admin page >
< Login >
마치며
오늘은 인터셉터에 대해서 알아보았습니다.
다음 포스팅에서 뵙겠습니다.
'[ JAVA ] > JAVA Spring' 카테고리의 다른 글
[ Spring ] Ajax 파일업로드 (0) | 2023.04.20 |
---|---|
[ Spring ] 코드 난독화 (1) | 2023.04.19 |
[ Spring ] 상품 수정/삭제 기능 구현 (0) | 2023.04.14 |
[ Spring ] 상품 등록/목록 페이지 구현 (0) | 2023.04.13 |
[ Spring ] 관리자 페이지 목록 구현 (0) | 2023.04.12 |