Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

희디비

[Spring] 필터, 인터셉터 (Interceptor) 본문

Spring

[Spring] 필터, 인터셉터 (Interceptor)

희디비 2024. 9. 5. 11:16

💡 문제 상황

로그인을 한 유저 A는 모든 요청을 허용 하지만

비 로그인 유저는 아이템 등록 폼으로 가는 것을 막고 싶습니다.

이럴땐 필요한 것이 필터 입니다.

 

💡 필터

요청 흐름

WAS( 톰캣 ) > 필터 > 서블릿( DispatcherServlet ) > 컨트롤러

 

비로그인 한 유저는 필터에서 검증을 해서 막게 되면 서블릿, 컨트롤러 호출을 막을 수 있습니다.

 

필터 메서드

  • init() : 필터의 시작을 나타내는 메서드
  • destory() : 필터의 끝을 나타내는 메서드

⭐️doFilter( )

: 필터의 주요 메서드로  실제 검증 기능을 합니다.

 

dofilter 에서 비 로그인 사용자가 허가 되지 않은 url로 들어 왔다면 login 입력 폼으로 되돌리고

로그인에 성공 한다면 자신이 들어온 입력폼으로 redirect 합니다.

 

💥 주의 할 점

 

필터는 체이닝을 지원 하는데 필터를 여러개 등록 하고 순서 대로 실행 할 수 있습니다.

필터가 다 실행 되면 다음 순서로 서블릿을 호출 합니다.

이때 문제는 chain.dofilter 를 호출 해야 넘어 간다는 점 입니다.

실수로 dofilter 를 호출 하지 않으면 컨트롤러가 호출 되지 않는 문제가 발생 할 수 있습니다. 

 

필터 등록법

 

필터는 설정 클래스를 만들어 빈으로 등록 해주어야 합니다.

 

등록 시 필터의 순서, url 패턴을 지정 할 수 있습니다.

url 경로 패턴은 * ( 모든 하위 경로 포함 ) 만 제공 되는데 모든 경로로 설정시 

필터에서 사용하지 않을 경로를 필터 에서 관리 해야 합니다.

 

💡 인터셉터

인터셉터도 개념은 필터와 같지만 장점은 필터 보다 편하게 사용 할수 있습니다.

등록은 필터와 같이 설정 클래스에 등록 합니다.

차이점은 빈으로 등록 하지 않고 오버라이딩 하여 사용 합니다.

 

인터셉터 URL 패턴

 

** : 하위 경로 모두 포함 합니다. ( 필터의 *와 같습니다 )

* : 자신의 레벨 까지만 포함 합니다.

ex) addPathPattern (" /* " ) 
/add ( O ) 
/post ( O )
/add/sub ( X )
/post/sub ( X )

 

또한 제외할 경로를 설정 할 수 있어 따로 인터셉터에서 처리 하지 않아도 됩니다.

 

요청 흐름

WAS( 톰캣 ) > 필터 > 서블릿( DispatcherServlet ) > 인터셉터 > 컨트롤러

 

인터셉터 메서드

 

preHandle : 컨트롤러가 호출전에 사용 됩니다. 리턴값이 Boolean 이며 false 반환시 컨트롤러 호출 하지 않습니다.

postHandle : 컨트롤러가 호출 된 후에 호출 됩니다. 컨트롤러에서 예외 발생 시 호출 되지 않습니다.

afterCompletion : 뷰가 렌더링 된후 호출 됩니다. 예외가 발생되어도 호출 됩니다.

 

인터셉터 ( 컨트롤러 예외 발생시 )

 

인터셉터 로그인 체크

로그인 체크는 컨트롤러 호출 전에 확인 해야 하므로 preHandle만 사용 하면 됩니다.

( 인터셉터 메서드는 default 메서드 입니다. 따라서 필요한 메서드만 사용 할 수 있습니다. )