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 에서 사용 가능한 메소드 정리
실행 후 시점에 동작 하는 로직을 작성 할 수 있다.
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 처리 로직 작성시 많이 쓰임 |
댓글