如何通过OpenFeign在两个Spring Boot项目间传递Cookie
方法一:全局Feign请求拦截器(推荐)
通过自定义RequestInterceptor,自动将当前请求中的"user"Cookie附加到Feign调用的请求头中,所有Feign调用都会生效。
创建拦截器类:
import feign.RequestInterceptor; import feign.RequestTemplate; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @Component public class FeignCookieInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (attributes == null) { return; } HttpServletRequest request = attributes.getRequest(); Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if ("user".equals(cookie.getName())) { template.header("Cookie", cookie.getName() + "=" + cookie.getValue()); break; } } } } }
将该类放入第一个项目的Spring扫描路径下,Spring会自动将其作为Feign的拦截器生效。
方法二:手动在Feign接口中传递Cookie
针对特定Feign接口,通过请求头参数手动传递Cookie。
1. 修改Feign接口
@FeignClient(value = "abc", url = "http://someexample.com/emp/user") public interface MyClient { @GetMapping(value = "/details") void getDetails(@RequestHeader("Cookie") String cookieHeader); }
2. 在调用方传递Cookie
class SomeClass { @Autowired private MyClient myClient; @Autowired private HttpServletRequest request; void someMethod1() { Cookie userCookie = org.springframework.web.util.WebUtils.getCookie(request, "user"); String cookieHeader = userCookie != null ? userCookie.getName() + "=" + userCookie.getValue() : ""; myClient.getDetails(cookieHeader); } }
注意事项
如果第一个项目的调用是异步执行,RequestContextHolder可能无法获取到当前请求上下文,此时需要手动将请求上下文传递到异步线程中,或者在异步方法内重新设置上下文。
内容的提问来源于stack exchange,提问作者Coder17
相关产品推荐
相关产品推荐

