我需要获取从一个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<String, String> 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<XXXXXResult> postResult = RestTemplateUtils.post(loginUrl, XxxResult.class);
HttpHeaders headers = postResult.getHeaders();
List<String> 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));
}
}