Interceptor란 컨트롤러에 들어오는 요청 HttpRequest와 컨트롤러가 응답하는 Http Response를 가로채는 역학을 한다.
인터셉터는 관리자만 접근할 수 있는 관리자 페이지에 접근하기 전에 관리자 인증을 하는 용도로 활용될 수 있다.
컨트롤러에서 인터셉터를 활용하여 접근 권한을 해보고, 기술 침투적인 HttpSession을 제거하여 세선을 처리하려 한다.
인터셉터는 Servlet의 앞, 뒤에서 HttpRequest, HttpResponse을 가로채는 Filter와 역할이 유사한데
Filter와 Interceptor는 분명히 다르다
Filter와 Interceptor의 차이
1. 호출 시점
Filter는 DispatcherServlet이 실행되기 전 , Interceptor는 DispatcherServlet이 실행된 후
2. 설정 위치
Filter는 web.xml , Interceptor는 spring-servlet.xml
3. 구현 방식
Filter는 web.xml에서 설정을 하면 구현이 가능하지만, Interceptor는 설정은 물론 메서드 구현이 필요합니다.
<<Interceptor 설정 방법>>
(1) servlet-context.xml
Interceptor 클래스가 Dispacther Servlet에 우선시하여 얽히게 된다 그래서 Interceptor 지정
모든 url 처리는 /** 로 작성하고,
특정 Controller마 처리 하기 위해서는 <mapping path="/login" />등으로 추가적으로 기술하면 처리된다.
<interceptors>
<interceptor>
<mapping path="/**"/>
<beans:bean class="com.dayoon.study.common.Interceptor.AuthInterceptor"></beans:bean>
</interceptor>
</interceptors>
(2) AuthInterceptor의 preHandle, postHandle
인터셉터는 HandHandlerInterceptorAdapter클래스를 상속받아서 만든다.
HandlerInterceptorAdapter에서는 사용할 수 있는 몇가지 메소드들이 있는데
그 중 주로 사용하는 메소드가 전처리기와 후처리기이다.
전처리기(preHandle) : client - > controller로 요청할 때 그 요청을 처리
후처리기(postHandle) : controller -> client로 요청을 줄 때 처리
package com.dayoon.study.common.Interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class AuthInterceptor extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
/*로직처리*/
return super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
}
preHandle 메소드는 컨트롤러가 호출되기 전에 실행되어 컨트롤러 실행 이전에 처리해야 할 작업이 있다거나, 요청 정보를 가공하거나 추가하는 경우에 사용할 수 있다. 또한 요청에 대한 로그를 남기기 위해 사용하기도 한다. 리턴 값이 true 이면 핸들러 실행 체인의 다음 단계로 진행되지만, false라면 작업을 중단하고 리턴하므로 컨트롤러와 남은 인터셉터들은 실행되지 않는다.
postHandle 메소드는 컨트롤러를 실행한 후에 호출 되므로 주로 후처리 작업을 위해 사용한다.
이 메소드에서는 컨트롤러가 돌려준 ModelAndView 타입의 정보가 제공되기 때문에 컨트롤러 작업 결과를 참조하거나 조작할 수 있다. preHandle에서 false를 리턴하면 postHandle은 컨트롤러가 실행되지 않았기 때문에 당연히 실행되지 않는다.
Reference : victorydntmd.tistory.com/176
'Study > Spring' 카테고리의 다른 글
스프링 암호화 기능 (0) | 2020.10.22 |
---|---|
AOP란? (AOP 적용 예제) (0) | 2020.10.16 |
스프링 Filter 만들기 (0) | 2020.10.13 |
mybatis query log (변수 매핑된 쿼리 로그 출력) (0) | 2020.10.13 |
Eclipse maven repository 경로 설정(settings.xml) (0) | 2020.10.07 |
댓글