HttpClient不会将所有cookie发送到restful api

时间:2018-06-16 02:09:50

标签: java apache apache-httpclient-4.x

我使用HttpClient 4.4.1调用一个restful api,但它没有发送cookie,

private CloseableHttpResponse call(String url, javax.servlet.http.HttpServletRequest httpServletRequest) {

    HttpGet request = new HttpGet(url);
    BasicHttpContext localContext = new BasicHttpContext();

    CookieStore cookieStore = new BasicCookieStore();
    javax.servlet.http.Cookie[] cookies = httpServletRequest.getCookies();
    BasicClientCookie basicClientCookie = null;
    if (cookies != null) {
        for (int i = 0; i < cookies.length; i++) {
            javax.servlet.http.Cookie cookie = cookies[i];
            basicClientCookie = new BasicClientCookie(cookie.getName(), cookie.getValue());
            basicClientCookie.setDomain(cookie.getDomain());
            basicClientCookie.setPath("/");
            basicClientCookie.setAttribute(ClientCookie.DOMAIN_ATTR, "true");
            basicClientCookie.setVersion(0);
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DAY_OF_YEAR, 100);
            Date date = calendar.getTime();
            basicClientCookie.setExpiryDate(date);
            cookieStore.addCookie(basicClientCookie);
        }
    }
    if (cookieStore.getCookies() != null) {
      System.out.println("Cookies size " + cookieStore.getCookies().size());
    }
    localContext.setAttribute(HttpClientContext.COOKIE_STORE, cookieStore);

    CloseableHttpClient httpClient = HttpClients.createDefault();
    CloseableHttpResponse httpResponse = null;
    try {
        httpResponse = httpClient.execute(request, localContext);
    } catch (IOException e) {
        System.out.println("msg " + e.getMessage());

    }
    return httpResponse;
}

我可以看到它只发送了最后添加的cookie。我错过了什么?请帮忙。

1 个答案:

答案 0 :(得分:0)

问题肯定在for循环中的代码中,因为只有最后添加的cookie是可见的。

尝试使用调试器调试for循环,或者在从请求获取cookie数组时在循环之前添加system.out.println语句,而不是在创建基本客户端cookie时循环内部然后之前和之后将基本客户端Cookie添加到cookiestore

正如评论中所建议的那样,您还没有将cookiestore添加到上下文中。

localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

上述代码的另一个问题是

basicClientCookie.setDomain(cookie.getDomain());
cookie.getDomain()

request和网址可能会有所不同,根据Cookie的行为,它们应该相同,只有Cookie会发送。因此,只有具有相同网址的Cookie才会与请求一起发送