Interceptor

호떡·2022년 10월 19일
0

Interceptor?

  • HandlerInterceptor를 구현한 것 (또는 HandlerInterceptorAdapter를 상속한 것)
  • 요청(requests)을 처리하는 과정에서 요청을 가로채서 처리
  • 접근 제어(Auth), 로그(Log) 등 비즈니스 로직과 구분되는 반복적이고 부수적인 로직 처리
  • 예를 들어, 클라이언트가 게시글 작성 페이지를 달라는 요청을 보냈을 경우 서버에서 처리하는 과정 중에 인터셉터가 해당 요청을 가로채서 로그인이 되어있는지 확인하는 로직을 실행할 수 있다. 로그인이 되어있을 경우 해당 요청을 서버에서 계속 처리할 수 있도록 하지만, 로그인이 되어있지 않으면 로그인 페이지로 해당 요청을 보내버릴 수 있다.

HandlerIntercepter의 주요 메서드

  1. preHandle(): Handler가 실행되기 이전에 호출
  2. postHandle(): Handler가 실행되고 나서 호출
  3. afterCompletion(): 요청이 처리되고 뷰 생성이 완료된 후에 호출

servlet-context.xml에 등록


📝 로그인 인터셉터 구현

	<!-- 구현한 인터셉터를 bean으로 등록 -->
	<beans:bean class="com.sd08.mvc.interceptor.LoginCheckInterceptor" id="confirm"/>
    
    <!-- 요청 경로(path)Interceptor bean을 매핑 -->
	<interceptors>
		<interceptor>
			<mapping path="/*"/>
			<!-- 인터셉터를 거치지 않을 페이지 따로 지정 (login 페이지와 home 페이지)-->
			<exclude-mapping path="/login"/>
			<exclude-mapping path="/"/>
			<beans:ref bean="confirm"/>
		</interceptor>
	</interceptors>

📌 인터셉터 Mapping 방식
1. mapping path: 인터셉터를 걸어놓고 싶은 경로 매핑
2. exclude-mapping: 모든 경로를 걸어놓고 지정해 놓은 페이지는 제외 (위의 예시)

필요한 Interceptor 구현

로그인을 위한 Interceptor이다. 로그인 성공은 아이디와 패스워드가 같을 경우 로그인을 승인하도록 구현하였다.

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.HandlerInterceptor;HandlerInterceptor 구현
public class LoginCheckInterceptor implements HandlerInterceptor{
	
	⭐  preHandle 메서드 오버라이드
	/**
	 * HandlerMapping이 되기 이전에
	 * @return boolean타입으로 true일 경우, 계속 실행 false일 경우, 계속 실행하지 않겠다
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// 1. 해당 요청 영역 내의 세션 불러오기
		HttpSession session = request.getSession();
		
		if(session.getAttribute("loginUser") == null) {
			// @GetMapping("login")에 매핑된다
			// get방식으로 요청보내는 것이므로
			response.sendRedirect("login");
			return false;
		} else {
			return true;
		}
	}
}

0개의 댓글