인터셉터는 사용자의 요청을 가로채는 역할을 합니다.
사용자의 요청이 컨트롤러에 가기 전에 가로채고, 서버의 응답이 사용자에게 가기 전에 가로챕니다.
즉 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 {
}
}
- preHandle() 메소드는 컨트롤러가 호출되기 전 실행 됩니다.
파라미터 obj는 Dispatcher의 HandlerMapping이 찾은 컨트롤러의 메소드를 참조하는 HandlerMethod 객체입니다. - postHandle() 메소드는 컨트롤러가 실행된 후 실행됩니다.
- 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 |