먼저 클래스에 HandlerInterceptor를 implements 받는다.
그리고 나서 Override/Implement Method 클릭하여 상속받을 메소드를 확인한다.
HandlerInterceptor에 대한 3가지의 상속 메소드를 확인할 수 있다.
afterCompletion, postHandle, preHandle가 뜨면 정상
위 3가지 메소드에 대하여 알아보자
- preHandle (사전 제어)
지정된 컨트롤러의 동작 이전에 수행할 동작
- afterCompletion (사후 제어)
지정된 컨트롤러의 동작 이후에 처리할 동작
Dispatcher Servlet의 화면 처리 이전을 말한다.
- postHandle (처리 이후)
Dispatcher Servlet의 화면 처리가 완료된 이후 처리할 동작.
필요한 메소드에 체크하고 OK누르면 다음과 같이 implements 된다.
해당 코드는 3가지 메소드 전부 implements 받은 상태
public class AuthInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// TODO Auto-generated method stub
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
다음으로 HandlerInterceptor를 이용하여 권한에 대한 인터셉터 처리를 구현하는 실습을 진행해보자
public class AuthInterceptor implements HandlerInterceptor {
private Logger logger = LoggerFactory.getLogger(AuthInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
logger.info("[interceptor] : preHandle");
HttpSession session = request.getSession();
if (session.getAttribute("loginInfo") == null) {
if (!(request.getRequestURI().contains("index/") || request.getRequestURI().contains("member/")) {
request.setAttribute("msg", "로그인 이후 사용 가능한 기능입니다.");
request.setAttribute("back", "back");
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/common/result.jsp");
rd.forward(request, response);
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
logger.info("[interceptor] : postHandle");
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
logger.info("[interceptor] : afterCompletion");
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
위의 코드에서는 세션의 Attribute값이 null일 경우
즉, 로그인하지 않았을 경우 URL에 "index/" 나 "/member"가 포함되어 있다면
사용자에게 로그인 이후 사용가능한 기능이라는 alert 창을 표시해주었다.