본문 바로가기

SPRING

HandlerInterceptor : 세션을 미리 확인하자

HandlerInterceptor 핸들러 인터셉터

특정한 URI 호출을 가로채는 역할을 한다.

이를 이용하여 기존 컨트롤러의 로직을 수정하지 않고도 사전이나 사후에 제어가 가능하다.

 

참고로, Adaptor가 인터페이스와 다른 점은 인터페이스는 모든 추상 메서드를 구현해야 하지만

HandlerInterceptorAdaptor는 일단 초벌구이처럼 모든 추상 메서드를 대충 구현해놓은 상태라

여러 개의 메서드 중에서 내가 원하는 것 하나만 가져다가 써도 나머지 두 추상 메서드를 구현하지 않아도 되는 장점이 있다.

 

 

HandlerInterceptor는 대표적으로 세 가지의 메서드를 가지고 있다.

 

preHandle()

컨트롤러 실행 전에 필요한 기능을 구현할 때 사용

반환 값이 true인 경우에만 컨트롤러 요청으로 진행됨

 

postHandle()

컨트롤러가 정상적으로 실행된 이후 추가 기능을 구현할 때 사용

Exception 발생 시 동작하지 않음

 

afterCompletion()

뷰가 클라이언트에 응답을 전송한 뒤에 실행

컨트롤러 실행 중 Exception 발생 시 네 번째 매개변수에 전달되게 되어 있음

실행 후 예기치 못한 예외를 로그로 남기거나 실행 시간 기록 등 후처리에 유용

 

 

public class AuthCheckInterceptor extends HandlerInterceptorAdapter {
	
	// 컨트롤러 실행 전
	@Override
	public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler)
			throws Exception {
	}
	
	// jsp 파일로 응답을 처리한 후
	@Override
	public void afterCompletion(HttpServletRequest req, HttpServletResponse res, Object handler, Exception ex)
			throws Exception {
	}
	
	// 컨트롤러가 정상적으로 실행된 후
	@Override
	public void postHandle(HttpServletRequest req, HttpServletResponse res, Object handler,
			ModelAndView modelAndView) throws Exception {
	}
	
}

 

 

총 세 가지의 메서드 중 이번 예제에서는 컨트롤러 동작 전에 호출되는 preHandel()를 사용할 것이다.

다음은 로그인 하기 전에 세션을 확인하는 예제이다.

즉, 로그인 컨트롤러가 동작하기 전에 호출을 가로채서 세션이 등록되어 있는지를 판단한다.

 

 

1. servlet-context.xml에 <mvc:interceptors> 설정 추가

 

<!-- 
	 인터셉터 설정(ant패턴)
	 * : 0개 이상의 문자
	 ? : 문자 한 개
	 ** : 0개 이상의 디렉터리 경로(all)
	 <mvc:exclude-mapping> : 제외할 경로 지정
 -->
 
<mvc:interceptors>
	<mvc:interceptor>
		<mvc:mapping path="/edit/**"/>
		<mvc:exclude-mapping path="/edit/help/**"/>
		<bean class="spring.AuthCheckInterceptor"/>
	</mvc:interceptor>
</mvc:interceptors>

 

2.HandlerInterceptorAdapter를 구현하는 AuthCheckInterceptor 인터셉터 작성

 

package spring;

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

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class AuthCheckInterceptor extends HandlerInterceptorAdapter {
	
	// 컨트롤러 실행 전
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		
		HttpSession session = request.getSession(false); // 세션이 있니? false: 없으면 자동으로 만들지마라
		
        if(session != null) { // 세션이 존재한다면
			Object authInfo = session.getAttribute("authInfo"); // 인증 정보 저장 객체에 담아줘
			if(authInfo != null) { // 만약 인증 객체에 이미 정보가 들어있다면
				return true; // 문제없으니 true 반환
			}
		}
		// 만약 세션이 존재하지 않는다면
		response.sendRedirect(request.getContextPath() + "/login"); // 로그인 페이지로 이동
		return false;
	}
	
}

 

참고) 테스트시 필요한 파일

 

 

'SPRING' 카테고리의 다른 글

스프링 유효성 검증 : @Valid 어노테이션  (0) 2020.10.15
쿠키 @CookieValue  (0) 2020.10.13
로그인 / 로그아웃 / 세션  (0) 2020.10.12
비밀번호 변경하기  (0) 2020.10.12
404 NOT_FOUND 처리하기  (0) 2020.10.11