SPRING/Intercepter 사용

[ SPRING ] Intercepter 를 사용한 login session 관리

정윤재 2011. 12. 13. 21:14
Spring 에서는 Intercepter 라는 것을 사용 하여 모든 controller 로직이 실행 되기 전이나
실행 후 시점에 동작 하는 로직을 작성 할 수 있다.

Flow 는

URL request 요청 => dispatcher-servlet.xml 의 intercepter 정의 => intercepter 로직 실행
=> controller 로직 실행 => response 페이지 이동
(여기서 intercepter 로직 실행 => controller 로직 실행  의 순서는 바뀔 수 있다.)


그럼 코드를 보고 이해 해 보도록 하자.
=============================
dispacher-servlet.xml 추가 내용

<mvc:annotation-driven/>
<mvc:interceptors>
 <bean class="com.incross.user.service.LoginCheckIntercepter"/>
<!-- controller 실행 전이나 후에 실행 될 intercepter 로직 class -->
</mvc:interceptors>
=============================
LoginCheckIntercepter.java 내용 (intercepter)

package com.incross.user.service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.incross.dto.UserDTO;

@Service
public class LoginCheckIntercepter extends HandlerInterceptorAdapter {
 //HandlerInterceptorAdapter 를 상속 받아야 intercepter 등록이 가능함
 private static final Logger logger  =  Logger.getLogger(LoginCheckIntercepter.class);
 
 @Override
 public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler){
  
  
  boolean result   =  false;
  String rootPath   =  request.getContextPath();
  try{
   logger.debug("enter intercepter");
   HttpSession session  =  request.getSession(false);
   
   if(session == null){
    // session non exist
    
    response.sendRedirect(rootPath);
    //index.jsp 로 이동, web.xml 에 설정 되어 있음 (<welcome-file-list> 태그)
    return false;
   }else{
    
    UserDTO userDTO  =  (UserDTO)session.getAttribute("userInfo");
    //UserInfo 로 세션 등록
    if(userDTO != null && userDTO.getUSER_ID() != null){
     // session exist
    }else{
     // session non exist
       response.sendRedirect(rootPath);
     
     return false;
    }
    
   }
   
   result =  true;
      
  }catch(Exception e){
   e.printStackTrace();
   logger.debug(e.getMessage());
   return false;
  }
  
  return result;
 }
}

=============================================
intercepter 에서 사용 가능한 메소드 정리

메소드 명 return 값 설명
preHandle boolean 1. 클라이언트의 요청을 컨트롤러에 전달 하기 전에 호출
2. false 인 경우 intercepter  또는 controller 를 실행 시키지 않고
요청 종료
postHandle void 1. 컨트롤러 로직 실행 된 후 호출됨
2. 컨트롤러 실행 도중 error 발생의 경우 postHandle() 는 실행
되지 않음
3. request 로 넘어온 데이터 가공시 많이 쓰임
afterCompletion void 1. 컨트롤러 로직 실행 된 후 호출 됨
2. 컨트롤러 실행 도중이나 view 페이지 실행 도중 error 발생 해도
실행됨
3. 공통 Exception 처리 로직 작성시 많이 쓰임