Apache httpclient 4.5.3 SPNEGO握手不存储cookie

时间:2017-02-08 15:59:11

标签: java httpclient spnego

我正在尝试使用SPNEGO身份验证对后端执行HTTP调用。 SPNEGO身份验证部分本身似乎根据跟踪日志工作,但登录失败,因为服务器后端是有状态的,并且它发送回的第一个401响应的会话cookie未被httpclient使用。我可以在跟踪日志中看到httpclient如何发送第一个请求,获得带有" set-cookie"的401。标题,但没有处理该cookie;然后当httpclient使用"授权"以新请求响应时标题,没有cookie;因此,服务器从头开始另一次登录,并再次使用401响应,使用新的" set-cookie"标题和新的会话。

握手失败后,httpclient会实际处理新的第二个会话cookie并存储它;这在跟踪日志中也是可见的。我的cookie处理代码如下所示:

        BasicCookieStore cookieStore = new BasicCookieStore();
        HttpClientBuilder clientBuilder = HttpClients.custom()
                .setConnectionManager(SslHandler.createClientConnectionManager(adapterType))
                .setRedirectStrategy(new IgnoreRedirectStrategy())
                .setRetryHandler(new DefaultHttpRequestRetryHandler(2, true))
                .setDefaultHeaders(allHeaders)
                .setSSLHostnameVerifier(SslHandler.getHostnameVerifier(adapterType))
                .setDefaultRequestConfig(defaultRequestConfig)
                .setDefaultCookieStore(cookieStore);

        RequestConfig localConfig = RequestConfig.custom()
                .setCookieSpec(CookieSpecs.STANDARD)
                .build();
        request.setConfig(localConfig);

        CloseableHttpClient client = clientBuilder.build();
        localcontext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
        org.apache.http.HttpResponse response = client.execute(request, localcontext);

所以基本上问题是:在SPNEGO或NTLM握手期间是否有必要做一些特殊的事情来存储/处理cookie?它似乎在这种握手之外工作,但不是在它们之间。

1 个答案:

答案 0 :(得分:0)

我可以使用此代码修复此问题:

https://github.com/eveoh/ews-java-api/commit/c6f54bb9665c3b714e41ad43ebe31527f77b59fe

通过它,cookie可以在握手过程中正确存储和使用。