웹플럭스에서 인터셉터기능을 만들어보기 위해서 webfilter를 사용 해 보았다.
사실 스프링처럼 무언가 Interceptor 형식의 클래스나 인터페이스가 있을 줄 알았는데..따로 존재하지는 않는 것 같다.
* 물론 제 기준으로 못찾은 것 일수 있습니다! 구글링을 하여도 웹필터를 사용하라고 권장하고 있었습니다.
그리하여 대신 사용한 것이 바로 웹필터 클래스이다.
웹필터 클래스는 웹플럭스를 사용하면 따로 라이브러리를 추가하지 않아도 된다.
웹필터 클래스는 역시나 인터페이스의 종류이며, filter라는 메소드를 사용할 수 있게 해 준다.
만들 클래스를 정해준 뒤에 상속받으면 된다.
먼저 헤더에 특정값을 써 주는 모습의 클래스이다.
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;
@Component
public class InterceptingWebfilter implements WebFilter{
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
exchange.getResponse().getHeaders().add("Access-Control-Allow-Origin", "*");
exchange.getResponse().getHeaders().add("Access-Control-Allow-Headers", "*");
return chain.filter(exchange);
}
}
InterceptingWebfilter 라는 클래스를 만들어 주면서 WebFilter를 상속받았다.
응답헤더에 크로스도메인과 관련된 내용을 추가해주는 모습의 예제이다.
익숙한 Mono라는 객체도 보인다.
저기 저 exchange를 활용하여야 흔히 아는 로그인시 세션확인, 파라미터 확인 등등 행위를 할 수 있다.
마찬가지로 응답하는 주소를 바꾸어 리다이렉션까지 가능하다.
흔히 사용되는 세션(Session)체크를 하려면 exchange의 getSession 메소드를 통해서 데이터를 가공 해 주어야 한다.
import org.springframework.stereotype.Component;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;
@Component
public class InterceptingWebfilter implements WebFilter{
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
exchange.getResponse().getHeaders().add("Access-Control-Allow-Origin", "*");
exchange.getResponse().getHeaders().add("Access-Control-Allow-Headers", "*");
return exchange.getSession().map( session ->{
//session.getAttributes(); //-> 세션값, Map형태로 되어 있다.
return chain.filter(exchange);
}).flatMap( arg-> Mono.from(arg));
}
}
역시 웹플럭스는 함수형으로 코딩하도록 되어있다. map을 통해서 세션값을 이것저것 변경할 수 있다.
exchange에서 response 객체를 가져와서 조건에 따라 리다이렉션하는 부분도 가능하다.
위 코드를 조금만 고쳐보면,
import org.springframework.stereotype.Component;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;
@Component
public class InterceptingWebfilter implements WebFilter{
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
exchange.getResponse().getHeaders().add("Access-Control-Allow-Origin", "*");
exchange.getResponse().getHeaders().add("Access-Control-Allow-Headers", "*");
return exchange.getSession().map( session ->{
ServerHttpResponse response = exchange.getResponse();
if(session.getAttributes().get("abcd") == null) { //원하는 세션 값
session.getAttributes().put("error", "error"); //세션에 넣는 방법
response.setStatusCode(HttpStatus.SEE_OTHER);
response.getHeaders().add(HttpHeaders.LOCATION, "/error"); //리다이렉션 주소
return response.setComplete();
}
response.setStatusCode(HttpStatus.ACCEPTED);
return chain.filter(exchange);
}).flatMap( arg-> Mono.from(arg));
}
}
세션값 여부에 대해서 리다이렉트하는 기능을 추가하여 보았다.
세션에서의 값이 없는경우, 상태 코드를 SEE_OTHER로 통하여 요청의 행위를 다른곳을 바라보게 하였다.
그리고 response에서 setComplete라는 메소드를 호출하여 해당 응답을 종료하게 하였다.
리다이렉트 하는 경우 해당 상태코드(HttpStatus)를 다양하게 부여하여 404같은 효과도 줄 수있다.
이상으로 웹필터를 통해 인터셉터구현 방법에 대해 살펴 보았다.
다음번에는 AOP 적용에 대해서 살펴 보겠다.
spring webflux!
* 내용을 채우고 수정중입니다.
* 튜토리얼이나 가이드 목적보다도 개념정리에 목적을 두고 쓰고있습니다. 틀린부분이나 누락된 부분은 꼭 알려주세요!
'Spring framework > Spring Webflux' 카테고리의 다른 글
spring webflux 10 (웹플럭스 적용기, Multipart param, 웹플럭스 멀티파트 파라미터) (0) | 2020.07.27 |
---|---|
spring webflux 9 (웹플럭스 적용기, AOP) (3) | 2020.04.10 |
spring webflux 7 (웹플럭스 적용기, MongoDb) (0) | 2020.04.01 |
spring webflux 6 (웹플럭스 적용기, Mysql) (0) | 2020.03.30 |
spring webflux 5 (웹플럭스 적용기, Mono와 Flux의 Processor) (0) | 2020.03.25 |
댓글