java - Apache httpclient 4.5.3 SPNEGO 握手不存储 cookie

标签 java httpclient spnego

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

握手失败后,httpclient 实际上会处理新的第二个 session 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?它似乎在握手之外起作用,但在握手期间不起作用。

最佳答案

我可以使用以下代码解决该问题:

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

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

关于java - Apache httpclient 4.5.3 SPNEGO 握手不存储 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42117872/

相关文章:

java - 写入文件: Constraints and Variables of Gurobi GRBModel in Java

java - JTable 政策。表格下方的 gridBagLayout 面板上的空白空间。

java - 应用程序 (.jar) 错误 - NoClassDefFoundError

java - Kerberos - 找不到适当类型的 key 来解密 AP REP - RC4 与 HMAC

kerberos - 可选的 SPNEGO Kerberos 身份验证

java - Gradle 自定义插件取决于系统任务

android - 错误 Android - 收到 HTML 而不是 JSON

java - 使用 apache httpclient 4 显示请求 header 时出现问题

java - 从 android httpclient 程序访问 Servlet 时连接被拒绝?

java - Windows Server 上 Tomcat 中的 Spnego keytab 身份验证失败