안녕하세요, 코린이의 코딩 학습기 채니 입니다.
개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.
Interceptor
- 컨트롤러에 들어오는 요청 HttpRequest와 컨트롤러가 응답하는 HttpResponse를 가로채는 역할
Interceptor 흐름 살펴보기
LogInterceptor
@Slf4j
public class LogInterceptor extends HandlerInterceptorAdapter {
/**
* handler 메소드 호출 전
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
log.debug("==============================================");
log.debug("{} {}", request.getMethod(), request.getRequestURI());
log.debug("----------------------------------------------");
return super.preHandle(request, response, handler); // 늘 true를 반환!
}
/**
* handler 메소드 리턴 직후
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);
log.debug("+++++++++++++++++++++++++++++++++++++++++++++++");
log.debug("mav = {}", modelAndView);
}
/**
* jsp 처리 완료 후
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
super.afterCompletion(request, response, handler, ex);
log.debug("***********************************************");
log.debug("{}\n", response.getStatus());
}
}
servlet-context.xml
#8. interceptor 등록
<!-- #8 interceptor 등록 -->
<interceptors>
<interceptor>
<mapping path="/**"/> <!-- 모든 요청 의미 -->
<beans:bean id="logInterceptor" class="com.ce.spring2.common.interceptor.LogInterceptor"></beans:bean>
</interceptor>
</interceptors>
모든 요청에 대하여 com.ce.spring2.common.interceptor.LogInterceptor를 적용하겠다는 의미입니다.
페이지 실행 시 콘솔 출력값
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - ==============================================
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - POST /spring2/member/memberLogin.do
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - ----------------------------------------------
DEBUG: com.ce.spring2.member.model.dao.MemberDao.selectOneMember - ==> Preparing: select * from member where member_id = ?
DEBUG: com.ce.spring2.member.model.dao.MemberDao.selectOneMember - ==> Parameters: honggd(String)
DEBUG: com.ce.spring2.member.model.dao.MemberDao.selectOneMember - <== Total: 1
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - +++++++++++++++++++++++++++++++++++++++++++++++
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - mav = ModelAndView [view="redirect:/"; model={}]
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - ***********************************************
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - 302
메소드 호출 전
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - ==============================================
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - POST /spring2/member/memberLogin.do
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - ----------------------------------------------
handler 실행
DEBUG: com.ce.spring2.member.model.dao.MemberDao.selectOneMember - ==> Preparing: select * from member where member_id = ?
DEBUG: com.ce.spring2.member.model.dao.MemberDao.selectOneMember - ==> Parameters: honggd(String)
DEBUG: com.ce.spring2.member.model.dao.MemberDao.selectOneMember - <== Total: 1
handler 메소드 리턴 직후
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - +++++++++++++++++++++++++++++++++++++++++++++++
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - mav = ModelAndView [view="redirect:/"; model={}]
jsp 처리 완료 후
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - ***********************************************
DEBUG: com.ce.spring2.common.interceptor.LogInterceptor - 302
위와 같이 interceptor가 실행된 것을 확인할 수 있습니다.
로그인 Interceptor
LoginInterceptor
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 로그인 여부 확인
HttpSession session = request.getSession();
Member loginMember = (Member)session.getAttribute("loginMember");
if(loginMember == null) {
// Redirect Attribute 대신 사용할 FlashMap
FlashMap flashMap = new FlashMap();
flashMap.put("msg", "로그인 후 이용할 수 있습니다.");
FlashMapManager manager = RequestContextUtils.getFlashMapManager(request);
manager.saveOutputFlashMap(flashMap, request, response);
response.sendRedirect(request.getContextPath() + "/");
return false;
}
return super.preHandle(request, response, handler);
}
}
FlashMap을 이용하여 Redirect 처리를 하였습니다.
※ FlashMap 관련 참고 포스팅
https://ifuwanna.tistory.com/9
servlet-context.xml
<interceptor>
<mapping path="/member/memberDetail.do"/>
<mapping path="/member/memberUpdate.do"/>
<beans:bean id="loginInterceptor" class="com.ce.spring2.common.interceptor.LoginInterceptor"></beans:bean>
</interceptor>
로그인을 하지 않고 해당 mapping url에 접근하면 LoginInterceptor가 실행되어 위와 같이 처리됩니다.
※ interceptor 관련 유용한 포스팅
https://victorydntmd.tistory.com/176?category=698080
'Java > Spring' 카테고리의 다른 글
Spring) 할일 체크하기 (0) | 2022.08.24 |
---|---|
Spring) 할일 목록 조회하기(두 조건 상이하게 정렬하기), 할일 추가하기 (0) | 2022.08.24 |
Spring) Slf4j - 파일로 로그 출력하기 (0) | 2022.08.24 |
Spring) 회원 정보 수정 (0) | 2022.08.23 |
Spring) Model (ModelAndView, ModelMap, Model), @ModelAttribute, @SessionAttribute, @SessionAttributes (1) | 2022.08.23 |