본문 바로가기
[ JAVA ]/JAVA Spring

[ Spring ] Interceptor

by 환이s 2023. 4. 17.


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가 수행되고 화면 처리까지 끝난 뒤 호출됩니다. 

 

위 코드를 보면 IDNULL 이면 MAIN ACTION으로 넘어가지 않고 로그인 페이지로 넘어가면서 메시지로 안내해 줍니다.


출력

 

< Admin page >

 

 

 

< Login >

 


마치며

 

오늘은 인터셉터에 대해서 알아보았습니다.

다음 포스팅에서 뵙겠습니다.

728x90