상세 컨텐츠

본문 제목

[Spring] 스프링 인터셉터

Spring/Spring

by seoia 2021. 6. 5. 03:43

본문

인터셉터 (Interceptor)

인터셉터는 컨트롤러로 들어오는 HTTPRequest와 컨트롤러가 응답하는 HTTPResponse를 가로채는 역할을 한다.

 

웹 MVC 동작과정 중에서 인터셉터를 사용할 수 있다. 다수의 컨트롤러에 대해 동일한 기능을 적용할 때 사용한다.

특정 권한이 필요한 페이지 요청 시 권한이 있는지를 확인하거나, 세션이 만료되었는지 확인하는 등의 용도로 사용한다. 

즉 컨트롤러를 실행하기 전, 컨트롤러를 실행 후, 뷰 실행 전, 뷰 실행한 이후에 메서드를 실행하여 특정 시점에서 원하는 기능을 실행할 수 있다.


'AOP'  vs  'Interceptor'  vs  'Filter'

다수의 컨트롤러에 대해 동일한 기능을 적용하는 것은 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 전 실행
역할
  • 메소드 전후의 지점에 자유롭게 설정
  • 로깅, 트랜잭션, 에러 처리 등 비즈니스단의 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용
  • 주소, 파라미터, 애노테이션 등 다양한 방법으로 대상을 지정
  • 요청에 대한 작업 전/후로 가로챈다
  • Controller(Handler)에 관한 요청과 응답에 대해 처리
  • 스프링 내부에 존재하여 스프링의 모든 빈 객체에 접근 가능하다
  • 로그인 체크, 권한체크, 프로그램 실행시간 계산작업 로그확인 등의 작업을 처리
  • 주소로 대상을 구분
  • 요청과 응답을 거른뒤 정제하는 역할
  • 인코딩 변환 처리, XSS방어 등의 요청/응답에 대한 변경/확인 작업이 주가 된다.
  • 스프링 외부에 존재하여 스프링과 무관한 자원에 대해 동작한다
  • 주소로 대상을 구분
  • web.xml에 설정한다

 


인터셉터 구현(HandlerInterceptor)

스프링에서 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 설정 클래스에 추가하여 적용하기

- WebMbcConfigureraddInterceptors() 메서드로 인터셉터 설정

      -> 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://velog.io/@fortice/Spring-%EC%84%B8%EC%85%98-%EC%9D%B8%ED%84%B0%EC%85%89%ED%84%B0-%EC%BF%A0%ED%82%A4

 

[Spring] 세션, 쿠키, 인터셉터

스프링 세션, 인터셉터, 쿠키

velog.io

https://lifejusik1004.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9D%B8%ED%84%B0%EC%85%89%ED%84%B0-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0

 

[Spring] 스프링 인터셉터 구현하기

인터셉터란? 인터셉터는 웹 MVC 동작과정 중에서 할 수 있습니다. 예를 컨트롤러를 실행하기 전, 컨트롤러를 실행 후, 뷰 실행전, 뷰를 실행한 이후에 메서드를 실행하여 특정 시점에서 원하는 기

lifejusik1004.tistory.com

https://goddaehee.tistory.com/154

 

[Spring] Filter, Interceptor, AOP 차이 및 정리

[Spring] Filter, Interceptor, AOP 차이 및 정리 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ [Spring] 필터, 인터셉터, AOP 정리 ] 입니다. : ) 공통 프로세스에 대한 고민 자바 웹 개발을 하다보면, 공통..

goddaehee.tistory.com

 

'Spring > Spring' 카테고리의 다른 글

[Spring] 쿠키 연결하기  (0) 2021.06.05
[Spring] Session 연결하기  (0) 2021.06.03

관련글 더보기