인터셉터는 컨트롤러로 들어오는 HTTPRequest와 컨트롤러가 응답하는 HTTPResponse를 가로채는 역할을 한다.
웹 MVC 동작과정 중에서 인터셉터를 사용할 수 있다. 다수의 컨트롤러에 대해 동일한 기능을 적용할 때 사용한다.
특정 권한이 필요한 페이지 요청 시 권한이 있는지를 확인하거나, 세션이 만료되었는지 확인하는 등의 용도로 사용한다.
즉 컨트롤러를 실행하기 전, 컨트롤러를 실행 후, 뷰 실행 전, 뷰 실행한 이후에 메서드를 실행하여 특정 시점에서 원하는 기능을 실행할 수 있다.
다수의 컨트롤러에 대해 동일한 기능을 적용하는 것은 AOP(Aspect Oriented Programming)도 가능하다.
Filter도 무슨 행동을 하기전에 먼저 실행하거나, 실행한 후에 추가적인 행동을 할 때 사용한다.
그렇다면, AOP와 Interceptor, 그리고 Filter의 차이점은 어떤 것이 있을까?
먼저, HTTP 요청 흐름을 살펴보자
요청이 들어오면 Filter → Interceptor → AOP → Interceptor → Filter 순으로 거친다.
1. 서버를 실행시켜 서블릿이 올라오는 동안에 init이 실행되고, 그 후 doFilter가 실행된다.
2. 컨트롤러에 들어가기 전 preHandler가 실행된다
3. 컨트롤러에서 나와 postHandler, after Completion, doFilter 순으로 진행이 된다.
4. 서블릿 종료 시 destroy가 실행된다.
AOP | Interceptor | Filter | |
실행 위치 | 메소드 앞에 Proxy패턴의 형태로 실행 | 서블릿 단위에서 실행 DispathcerServlet 후 실행 |
서블릿 단위에서 실행 DispathcerServlet 전 실행 |
역할 |
|
|
|
스프링에서 HandlerInterceptor 인터페이스를 구현해서 세 가지 시점(세 가지 메서드)에서 인터셉터 처리가 가능하다.
메서드 명 | 역할 |
preHandler() | 컨트롤러를 실행하기 전 실행. -> false를 리턴하면 컨트롤러를 실행하지 않는다. |
postHandler() | 컨트롤러가 정상적으로 실행된 이후에 실행. 익셉션을 발생하면 실행되지 않는다. |
afterCompletion() | 뷰가 클라이언트 응답을 전송한 뒤 실행. 컨트롤러에서 익셉션 발생시 Exception 파라미터에 전달되고, 발생하지 않으면 null이 전달된다. 컨트롤러 실행 후 로그를 남기거나, 실행 시간을 기록하는 등의 후처리를 위한 메서드. |
또는 HttpServletRequest를 파라미터로 받아 getSession()으로 세션을 가져와 위와 마찬가지로 삭제한다.
HandlerInterceptor 를 상속 받은 클래스 파일을 생성한다. 메서들을 오버라이딩하여 사용한다. (단축키 Alt+Shift+S)
public class TestInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle (HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
return super.preHandler (request,response,handler);
}
@Override
public void postHandle (HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView mav) throws Exception{
return super.postHandle (request,response,handler,mav);
}
@Override
public void afterCompletion (HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception{
return super.afterCompletion (request,response,handler,ex);
}
}
인터셉터를 설정하는 두 가지 방법이 있다.
1. 인터셉터를 빈으로 등록하기
<servlet-context.xml>
<!-- 인터셉터 선언 -->
<beans:bean id="인터셉터 클래스명" class="인터셉터 클래스 경로"/>
<!-- 인터셉터와 url 매핑 -->
<interceptors>
<interceptor>
<mapping path=""/>
<beans:ref bean="인터셉터 클래스명"/>
</interceptor>
</inteceptors>
<beans:bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<beans:property name="order" value="0"/>
</beans:bean>
addInterceptor 메서드를 통해서 적용할 인터셉터 클래스를 전달하고, addPathPatterns 메서드의 파라미터로 인터셉터를 적용할 url 패턴을 입력합니다.
1. Mvc 설정 클래스에 추가하여 적용하기
- WebMbcConfigurer의 addInterceptors() 메서드로 인터셉터 설정
-> InterceptorRegister 객체의 addInterceptor() 메서드로 등록한 인터셉터를 설정
-> InterceptorRegister 객체의 addPathPatterns("ant 패턴")으로 인터셉트할 url 설정
<MvcConfig.java>
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
//인터셉터 설정 부분
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authCheckInterceptor())
.addPathPatterns("/edit/**")
.excludePathPatterns("/edit/help/**");
}
@Bean
public AuthCheckInterceptor authCheckInterceptor() {
return new AuthCheckInterceptor();
}
}
Ant 패턴 (Url 패턴)
패턴 | 설명 |
* | 0개 또는 그 이상의 글자 |
? | 1개의 글자 |
** | 0개 또는 그 이상의 폴더 경로 |
예시)
1. /member로 시작하고 확장자가 .info로 끝나는 모든 경로
@RequestMapping("/member /?*.info")
2. /faq/f로 시작하고, 한글자가 사이에 위치하고 oo.fq로 끝나는 모든 경로
@RequestMapping("/faq/f?oo.fq")
3. /folders/로 시작하고, 중간에 0개 이상의 중간 경로가 존재하고 /files로 끝나는 모든 경로
@RequestMapping("/folders/**/files")
https://goddaehee.tistory.com/154
[Spring] 쿠키 연결하기 (0) | 2021.06.05 |
---|---|
[Spring] Session 연결하기 (0) | 2021.06.03 |