我需要获取从一个restTemplate响应中收到的cookie,并将其传递给另一个请求。
整体思路如下:
1.用RestTemplate请求第三方服务的登录接口获取到对应的ResponseEntity。 2.从ResponseEntity中获取HttpHeaders,从HttpHeaders中获取Set-cookie。 3.将Set-cookie值放进本地map中。 4.在下一个请求的时候将cookie值放进Request header中。
具体代码如下:
@Slf4j
@Configuration
public class FeignOAuth2RequestInterceptor implements RequestInterceptor {
@Resource
private xxxxLoginClient xxxxxLoginClient;
private Map xxxxLogincookieMap = Maps.newHashMap();
private final String XXX_LOGIN_cookie = "xxxx_login_cookie";
private final String HEADER_cookie_NAME = "cookie";
private final String XXX_LOGIN_URL = "/user/login";
@Override
public void apply(RequestTemplate requestTemplate) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String feignTargetUrl = requestTemplate.feignTarget().url();
cookie[] cookies = request.getcookies();
String requestURI = request.getRequestURI();
boolean urlNotBlank = StringUtils.isNotBlank(requestURI);
boolean isxxxxServer = StringUtils.equalsIgnoreCase(feignTargetUrl, "http://localhost:9090/xxxx");
if (urlNotBlank && isxxxxServer) {
String loginUrl = "http://localhost:9090/xxxx" + XXX_LOGIN_URL + "?username=zclh&password=123456";
ResponseEntity postResult = RestTemplateUtils.post(loginUrl, XxxResult.class);
HttpHeaders headers = postResult.getHeaders();
List cookieList = headers.get("Set-cookie");
if (CollectionUtils.isNotEmpty(cookieList)) {
String cookie = cookieList.get(0);
xxxLogincookieMap.put(XXX_LOGIN_cookie, cookie);
}
}
log.info("cookies:{}", JSONObject.toJSONString(cookies));
String accessToken = request == null ? StringUtils.EMPTY : request.getHeader(HttpHeaders.AUTHORIZATION);
log.info("Feign拦截器,拦截到Feign的Http请求发送,从当前Request的Header中获取AUTHORIZATION值为:{}", accessToken);
requestTemplate.header(HttpHeaders.AUTHORIZATION, accessToken);
requestTemplate.header(HEADER_cookie_NAME, xxxLogincookieMap.get(XXX_LOGIN_cookie));
}
}



