몇 가지 미리 설정을 마쳐 놓았다고 전제하에 진행하겠습니다.
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
Api-GateWay 어플리케이션과 Discovery 어플리케이션 둘 다 등록, 설정이 완료된 상태입니다.
일단 라이브러리를 등록해줍니다.
그리고 이미 discovery 어플리케이션에 위와 같이 등록되어 있어
@FeignClient를 사용해 interface를
등록해주면 됩니다.
(“auction-user가 discovery에
등록된상태입니다. Gateway도 마찬가지입니다.”)
@FeignClient(name = "auction-user")
public interface AuctionUserInterFace {
@GetMapping("/user/info/{userid}")
ResponseEntity<UserModelFront> findUserModelFront(@RequestHeader("Authorization")String token,
@RequestHeader("RefreshToken") String reToken,
@PathVariable int userid);
@GetMapping("/user/info/{userid}")
ResponseEntity<UserModelFront> findUserModelFront(@PathVariable int userid);
@GetMapping("/user/info/{userid}")
ResponseEntity<UserModelFront> findUserModelFront(@RequestHeader("Cookie") String cookie,
@PathVariable int userid);
}
헤더를 담는 방법은 간단합니다 위와 같이 RequestHeder에
담아주면 됩니다.
Cookie는 문자열로 “name=value”
이런 식으로 담아줘야 합니다. 그냥 “=” 이거
없이 value로 담아서 보내면,
다른 어플리케이션이 받을 때는 cookie 이름없이 단순 네임만 받습니다
Ex) “cookievalue : “ 이런 식으로 나옵니다 원래라면
“name : value” 이렇게 받아져야 합니다.
만약에 위와 같이 해도 보내지지 않는다면 특별한 설정을 해둬야합니다.
FeignClient으로 보내는 쪽과 받는 쪽 둘 다 해주세요.
그리고 요청 받는 어플리케이션에 저렇게 엔드 포인트만 만들어주면 됩니다.
import feign.RequestInterceptor;
import org.apache.http.client.CookieStore;
import org.apache.http.impl.client.BasicCookieStore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfiguration {
@Bean
public RequestInterceptor feignCookieInterceptor(CookieStore cookieStore) {
return new FeignCookieInterceptor(cookieStore);
}
@Bean
public CookieStore cookieStore() {
return new BasicCookieStore();
}
}
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.apache.http.client.CookieStore;
import java.util.stream.Collectors;
public class FeignCookieInterceptor implements RequestInterceptor {
private final CookieStore cookieStore;
public FeignCookieInterceptor(CookieStore cookieStore) {
this.cookieStore = cookieStore;
}
@Override
public void apply(RequestTemplate template) {
if (cookieStore != null && !cookieStore.getCookies().isEmpty()) {
String cookies = cookieStore.getCookies().stream()
.map(cookie -> cookie.getName() + "=" + cookie.getValue())
.collect(Collectors.joining("; "));
template.header("Cookie", cookies);
}
}
}
두개의 자바 파일은 만약 기본적으로 FeignClient가 쿠키 값을
담아 보내주지 않을 때, cookie를 헤더에 담아서 보내주는 설정입니다. (원래 Header에 쿠키가 담겨서 보내지긴 한다.)