본문 바로가기
Java/Spring

Spring) Interceptor - LogInterceptor, LoginInterceptor

by 박채니 2022. 8. 24.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


Interceptor

- 컨트롤러에 들어오는 요청 HttpRequest와 컨트롤러가 응답하는 HttpResponse를 가로채는 역할

 

Interceptor 흐름 살펴보기

LogInterceptor

@Slf4j
public class LogInterceptor extends HandlerInterceptorAdapter {
	/**
	 * handler 메소드 호출 전
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		log.debug("==============================================");
		log.debug("{} {}", request.getMethod(), request.getRequestURI());
		log.debug("----------------------------------------------");
		
		return super.preHandle(request, response, handler); // 늘 true를 반환!
	}
	
	/**
	 * handler 메소드 리턴 직후
	 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		super.postHandle(request, response, handler, modelAndView);
		
		log.debug("+++++++++++++++++++++++++++++++++++++++++++++++");
		log.debug("mav = {}", modelAndView);
	}
	
	/**
	 * jsp 처리 완료 후
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		super.afterCompletion(request, response, handler, ex);
		
		log.debug("***********************************************");
		log.debug("{}\n", response.getStatus());
	}
}

 

servlet-context.xml

#8. interceptor 등록

<!-- #8 interceptor 등록 -->
<interceptors>
    <interceptor>
        <mapping path="/**"/> <!-- 모든 요청 의미 -->
        <beans:bean id="logInterceptor" class="com.ce.spring2.common.interceptor.LogInterceptor"></beans:bean>
    </interceptor>
</interceptors>

 

 

모든 요청에 대하여 com.ce.spring2.common.interceptor.LogInterceptor를 적용하겠다는 의미입니다.

 

페이지 실행 시 콘솔 출력값

DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - ==============================================
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - POST /spring2/member/memberLogin.do
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - ----------------------------------------------
DEBUG: com.ce.spring2.member.model.dao.MemberDao.selectOneMember - ==>  Preparing: select * from member where member_id = ? 
DEBUG: com.ce.spring2.member.model.dao.MemberDao.selectOneMember - ==> Parameters: honggd(String)
DEBUG: com.ce.spring2.member.model.dao.MemberDao.selectOneMember - <==      Total: 1
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - +++++++++++++++++++++++++++++++++++++++++++++++
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - mav = ModelAndView [view="redirect:/"; model={}]
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - ***********************************************
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - 302

 

메소드 호출 전

DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - ==============================================
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - POST /spring2/member/memberLogin.do
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - ----------------------------------------------

 

handler 실행

DEBUG: com.ce.spring2.member.model.dao.MemberDao.selectOneMember - ==>  Preparing: select * from member where member_id = ? 
DEBUG: com.ce.spring2.member.model.dao.MemberDao.selectOneMember - ==> Parameters: honggd(String)
DEBUG: com.ce.spring2.member.model.dao.MemberDao.selectOneMember - <==      Total: 1

 

handler 메소드 리턴 직후

DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - +++++++++++++++++++++++++++++++++++++++++++++++
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - mav = ModelAndView [view="redirect:/"; model={}]

 

jsp 처리 완료 후

DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - ***********************************************
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - 302

위와 같이 interceptor가 실행된 것을 확인할 수 있습니다.

 


로그인 Interceptor

LoginInterceptor

public class LoginInterceptor extends HandlerInterceptorAdapter {
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// 로그인 여부 확인
		HttpSession session = request.getSession();
		Member loginMember = (Member)session.getAttribute("loginMember");
		
		
		if(loginMember == null) {
			// Redirect Attribute 대신 사용할 FlashMap
			FlashMap flashMap = new FlashMap();
			flashMap.put("msg", "로그인 후 이용할 수 있습니다.");
			FlashMapManager manager = RequestContextUtils.getFlashMapManager(request);
			manager.saveOutputFlashMap(flashMap, request, response);

			response.sendRedirect(request.getContextPath() + "/");
			return false;
		}
		
		return super.preHandle(request, response, handler);
	}
}

FlashMap을 이용하여 Redirect 처리를 하였습니다.

※ FlashMap 관련 참고 포스팅

https://ifuwanna.tistory.com/9

 

[Spring] Redirect 관련 내용 ( RedirectAttributes / FlashMap )

POST/GET방식으로 예약생성같은 DB작업이 있는 페이지를 끝내고 결과페이지를 일반적으로 포워딩할경우 F5나 새로고침등으로 서버에 동일한 요청을 보내어 문제가 발생할 가능성이 있어 주요 서

ifuwanna.tistory.com

 

servlet-context.xml

    <interceptor>
        <mapping path="/member/memberDetail.do"/>
        <mapping path="/member/memberUpdate.do"/>
        <beans:bean id="loginInterceptor" class="com.ce.spring2.common.interceptor.LoginInterceptor"></beans:bean>
    </interceptor>

로그인을 하지 않고 해당 mapping url에 접근하면 LoginInterceptor가 실행되어 위와 같이 처리됩니다.

 

※ interceptor 관련 유용한 포스팅

https://victorydntmd.tistory.com/176?category=698080 

 

[Spring] Interceptor (1) - 개념 및 예제

인터셉터 ( Interceptor ) Interceptor란 컨트롤러에 들어오는 요청 HttpRequest와 컨트롤러가 응답하는 HttpResponse를 가로채는 역할을 합니다. 인터셉터는 관리자만 접근할 수 있는 관리자 페이지에 접근하

victorydntmd.tistory.com