본문으로 바로가기

인터셉터(Interceptor)란?

category 스프링 2020. 6. 13. 16:44

인터셉터는 사용자의 요청을 가로채는 역할을 합니다.
사용자의 요청이 컨트롤러에 가기 전에 가로채고, 서버의 응답이 사용자에게 가기 전에 가로챕니다.
즉 DispatcherServlet이 컨트롤러를 요청하기 전,후에
HttpRequest, HttpResponse 객체를 가로채어 가공합니다.

예를 들어 로그인 기능을 구현할 때, 로그인 한 사람만 보이는 페이지와 로그인 한 사람만 글을 작성할 수 있다고 합니다. 그러면 페이지 컨트롤러, 글 작성 컨트롤러에서도 로그인 여부를 확인하는 로직이 필요한데 인터셉터를 이용하여 이 로그인확인 로직을 하나의 인터셉터로 처리할 수 있습니다.

환경설정

spring-servlet.xml

<!-- Interceptors -->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**" /> 
        <bean class="com.khs.interceptor.MyInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

스프링의 서블릿 설정 파일입니다. MyInterceptor 클래스로 모든 요청을 가로챌 수 있습니다.

  • 인터셉터는 HandlerInterceptor 인터페이스로 구현해줍니다.

public class MyInterceptor implements HandlerInterceptor{

    // preHandle() 메소드
    // controller가 요청되기 전에 호출됨
    @Override
    public boolean preHandle(// 매개변수 Object는 핸들러 정보를 의미한다.
            HttpServletRequest request, HttpServletResponse response,
            Object obj) throws Exception {
        System.out.println("MyInterCeptor - preHandle");
        return false; // 반환이 false라면 controller로 요청을 안함
    }

    // postHandel() 메소드
    // controller의 handler가 끝나면 처리됨
    @Override
    public void postHandle(
            HttpServletRequest request, HttpServletResponse response,
            Object obj, ModelAndView mav)
            throws Exception {
    }

    // afterCompletion() 메소드
    // view까지 처리가 끝난 후에 처리됨
    @Override
    public void afterCompletion(
            HttpServletRequest request, HttpServletResponse response,
            Object obj, Exception e)
            throws Exception {
    }
}
  1. preHandle() 메소드는 컨트롤러가 호출되기 전 실행 됩니다.
    파라미터 obj는 Dispatcher의 HandlerMapping이 찾은 컨트롤러의 메소드를 참조하는 HandlerMethod 객체입니다.
  2. postHandle() 메소드는 컨트롤러가 실행된 후 실행됩니다.
  3. afterComplete() 메소드는 뷰의 실행까지 마치고 실행됩니다.
  • 다음 인터셉터는 사용자의 로그인 요청이 이메일과 비밀번호가 일치하는지 여부를 확인하는 예제입니다. HandlerInterceptorAdapter 클래스를 상속받아 구현해줍니다

  • AuthLoginInterceptor.java

    public class AuthLoginInterceptor extends HandlerInterceptorAdapter{
      @Autowired
      private UserService userService;
    
      @Override
      public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
          String email = request.getParameter("email");
          String pwd = request.getParameter("pwd");
    
          UserVO vo = new UserVO();
          vo.setEmail(email);
          vo.setPwd(pwd);
          boolean auth = userService.getUser(vo);
    
          return auth;
      }
    }

사용자의 요청에서 email 과 pwd의 파라미터를 받아 vo 객체를
서비스 계층에 전달하여 해당 유저가 존재하는지 값을 반환합니다.

spring-servlet.xml 설정

<mvc:interceptor>
    <mvc:mapping path="/user/login" /> 
    <bean class="com.khs.interceptor.AuthLoginInterceptor" />
</mvc:interceptor>

사용자가 로그인 요청(/user/login)을 하게되면 컨트롤러의 도달하기전에
인터셉터에서 이러한 인증 절차를 수행합니다.

'스프링' 카테고리의 다른 글

스프링의 AOP 란?  (0) 2020.06.23
스프링의 @ModelAttribute 어노테이션  (0) 2020.06.15
AJAX란?  (0) 2020.06.15
DispatcherServlet 이란?  (0) 2020.06.07
스프링 프로젝트 생성하기  (1) 2020.04.18