본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Spring framework/Spring Webflux

spring webflux 8 (웹플럭스 적용기, 웹 필터, 인터셉터)

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2020. 4. 6.

 

웹플럭스에서 인터셉터기능을 만들어보기 위해서 webfilter를 사용 해 보았다.

사실 스프링처럼 무언가 Interceptor 형식의 클래스나 인터페이스가 있을 줄 알았는데..따로 존재하지는 않는 것 같다.

* 물론 제 기준으로 못찾은 것 일수 있습니다! 구글링을 하여도 웹필터를 사용하라고 권장하고 있었습니다.

그리하여 대신 사용한 것이 바로 웹필터 클래스이다.

 

웹필터 클래스는 웹플럭스를 사용하면 따로 라이브러리를 추가하지 않아도 된다.

웹필터 클래스는 역시나 인터페이스의 종류이며, filter라는 메소드를 사용할 수 있게 해 준다.

Mono라는 임포트를 보아하니 이넘도 함수형으로 써야것군..

 

만들 클래스를 정해준 뒤에 상속받으면 된다.

먼저 헤더에 특정값을 써 주는 모습의 클래스이다.

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!

 

* 내용을 채우고 수정중입니다.

* 튜토리얼이나 가이드 목적보다도 개념정리에 목적을 두고 쓰고있습니다. 틀린부분이나 누락된 부분은 꼭 알려주세요!

 

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글