Feign-RestTemplate请求登录后获取Response Headers中的set-cookie放入下一个请求的Request Header中,以便认证通过。

我需要获取从一个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));
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值