7. SpringFramework(스프링 프레임워크) - Interceptor(인터셉터)

한승록·2023년 12월 2일
0

스프링 기초

목록 보기
9/9
post-thumbnail

1) 개념

인터셉터는 말 그대로 사용자의 request 를 가로채는 역할을 수행합니다.
예를 들어 로그인을 하지 않았는데 마이페이지에 URL 을 통해서 접속을 하면 안되겠죠?
이러한 경우 해당 주소를 입력하면 request 를 가로채서 로그인 화면으로 보낸다던가 로그인을 유도하는 알림창을 띄우고 해당 페이지로 접속하지 못하게 하는 것이죠.




2) 설정

Maven 프로젝트 기준 servlet-context에 설정하게 됩니다.
설정 방식은 보통 인터셉터의 조건을 작성하는 클래스를 작성하고 해당 인터셉터를 적용시키지 않을 예외 페이지를 설정하게 됩니다.

pulbic class LoginInterceptor {
	// 스프링에서 제공하는 인터셉터 클래스를 상속하여 오버라이딩으로 구성
    // handler : 컨트롤러
    
    // 컨트롤러에 요청 도달 전 인터셉터 수행하는 내용
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    	// 세션에 담긴 로그인 정보를 확인하기 위한 변수 선언 및 초기화
    	HttpSession session = rquest.setSession();
        
        // session에서 "login"의 키값에 해당하는 데이터가 null이 아니면
        if(session.getAttibute("login") != null) {
        	// true를 반환
        	return true;
        }
        
        // 원래 이동하려고 했던 이동주소
        String requestURL = request.getRequestURL().toString();
        requestURL = URLEncoder.encode(requestURL, "UTF-8");

		// 해당 로직은 원래 이동하려 했던 주소가 아닌 로그인 화면으로 이동하게 함
        String contextPath = request.getContextPath();
        response.sendRedirect(contextPath + "/member/login?url=" + requestURL);
        
        return false
    }
    
    // 컨트롤러에서 처리된 후 요청 인터셉터하는 내용
    @Override
    public void postHandle(HttpServletRequest reqeust, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    	
    }
    
    // view에 요청이 전달된 후 처리
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse resposne, Object handler, Exception ex) throws Exception {
    
    }
}
<!-- servlet-context -->
<interceptors>
  <interceptor>
    <mapping path="/board/**"/>
    <beans:bean id="LoginInterceptor"
                class="com.velog.interceptor.LoginInterceptor"/>
  </interceptor>
</interceptors>
부연 설명을 드리자면 해당 코드에서는 preHandle 메서드에서 사전 차단되기 때문에 혹시 모를 예외사항이 없다면 굳이 postHandleafterCompletion 에 코드를 작성하여 작업을 수행할 필요는 없습니다.
또한 하나의 인터셉터 클래스에 하나의 메서드가 작성되어야 한 것은 아니지만 해당 클래스의 의미에 부합하도록 작성하고 하나의 메서드가 하나의 역할만 수행하도록 명확하게 나눠주는 과정은 필수입니다.
profile
개발 학습

0개의 댓글