스프링 인터셉터

oasis·2023년 7월 20일

도서관 프로그램을 만들면서, 스프링 인터셉터로 유저 권한에 따라 다른 역할을 부여하는 기능을 구현해 보았다. 관리자는 도서 목록에 대한 CRUD가 가능하도록, 유저는 CRUD화면 이외의 다른 화면이 표시되도록 하였다.



스프링 인터셉터

스프링 프레임워크에서 실행되는, 클라이언트 요청 전후에 실행되는 컴포넌트



사용목적

  1. 인증 및 권한 부여: 요청이 들어오면 인증 상태를 확인하고 권한을 검사하는 등의 인증 및 권한 부여 작업을 수행
  2. 로깅: 요청과 응답에 대한 로그를 기록하거나 통계를 수집
  3. 예외 처리: 요청 처리 중 발생하는 예외를 처리하고 예외에 따른 적절한 응답을 반환
  4. 성능 측정: 요청 처리 시간을 측정하여 성능 통계를 수집하거나 성능 개선을 위한 정보를 수집
  5. 국제화 및 로케일 처리: 요청의 언어, 지역 설정 등을 확인하고 이에 따른 처리를 수행

HandlerInterceptor 인터페이스

  1. preHandle(): 요청 처리 이전에 호출되는 메서드로, 컨트롤러가 실행되기 전에 수행할 작업을 구현
    • 요청의 유효성 검사, 인증 및 권한 확인 등의 작업을 수행할 수 있음 - false를 반환하면 요청 처리가 중단
  2. postHandle(): 컨트롤러가 실행된 후, 뷰가 렌더링되기 전에 호출되는 메서드로, 요청 처리 이후의 작업을 구현
    • 주로 로그, 모델 데이터의 가공, 국제화 처리 등에 사용
  3. afterCompletion(): 뷰가 완전히 렌더링된 후 호출되는 메서드로, 응답 처리 이후의 작업을 구현
    • 주로 자원 해제, 성능 측정, 예외 처리 등에 사용


사용법

servlet-context.xml 빈 등록하기

<!-- 인터셉터 -->
	<beans:bean id="sampleInterceptor"
	 class="bitedu.bipa.book.utils.AuthorizationInterceptor" />
	<interceptors>
		<interceptor>
			<mapping path="/admin/**" />
			<beans:ref bean="sampleInterceptor" />
		</interceptor>
	</interceptors>
  • 주의: root경로인 book/ 경로는 path에 포함하지 않아도 된다.

Interceptor 작성하기

package bitedu.bipa.book.utils;

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

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class AuthorizationInterceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		String userRole = (String) request.getSession().getAttribute("id");
		System.out.println("인터셉터 " + userRole);
		if (userRole != null && userRole.equals("admin")) {
			return true; 
		}
		return false;
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
	}

}
  • 세션ID가 관리자인 경우 admin/하위의 컨트롤러를 실행시킨다.
  • 세션ID가 유저인경우 admin/하위컨트롤러는 실행시키지 않는다 → 도서 CRUD가 불가능해진다.

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

정말 유익한 글이었습니다.

답글 달기