Spring

부트캠프86일차 (interceptor)

동곤일상 2025. 6. 13. 16:16
반응형

 

 

1) Interceptor

 

설명 : 

용도

  • 인증/인가 처리
  • 요청 로깅
  • 공통 헤더 설정
  • 예외 처리

장점

  • 코드 재사용성 증가
  • 컨트롤러와 분리된 공통 로직 관리
  • 유연한 요청/응답 처리

인터셉터는 AOP와 유사하지만, HTTP 요청/응답에 특화된 스프링 MVC 전용 기능입니다.


MvcConfig 파일의 일부

(addInterceptors 메서드를 오버라이딩해  interceptor에 따른 행동을시킴)

@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(new BoardInterceptor())
		.addPathPatterns("/board/write")
		.addPathPatterns("/board/update")
		.addPathPatterns("/board/delete"); 
		//해당경로에접근하면 controller접근 전에 
		//BoardInterceptor검증을 통과해야함
		
	}

 

interceptor/BoardInterceptor

(

preHandle: 컨트롤러 호출 전에 실행. 요청을 가로채서 처리 가능(예: 인증 체크).

)

package kr.gdu.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import kr.gdu.exception.ShopException;
import kr.gdu.logic.User;

public class BoardInterceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		String boardid = request.getParameter("boardid");
		HttpSession session = request.getSession();
		User login = (User)session.getAttribute("loginUser");
		if(boardid==null || boardid.equals("1")) {
			//공지사항(boardid=='1')은 관리자만 쓸수있음!!!
			if(login==null) {
				String msg = "로그인부터하세요";
				String url = request.getContextPath()+"/user/login";
				throw new ShopException(msg, url);	
			}
			else if(!login.getUserid().equals("admin")) {
				String msg = "관리자만 등록가능";
				String url = request.getContextPath()+"/board/list?boardid=1";
				throw new ShopException(msg, url);	
			}
		}
		//로그인을안하면 자유게시판도 쓸수없게막아야함
		else if(boardid.equals("2")) {
			if(login==null) {
				String msg = "로그인부터하세요";
				String url = request.getContextPath()+"/user/login";
				throw new ShopException(msg, url);	
			}
		}
		return true; //BoardCotroller 정상실행
	}
}

해당 인터셉터는 boardid='1' or null (공지사항)일 때

관리자(admin)가 아닐 시 모두 예외가발생되게끔 로직 설정

 

또한 boardid=''2"일때는 로그인확인만 진행