You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过OpenFeign在两个Spring Boot项目间传递Cookie

解决Feign调用传递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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 04:36:22