0

在 Windows 机器上从 Web 浏览器中访问以下 JSON URL 很简单,因为这会弹出一个身份验证框,要求输入用户名和密码,输入时正确显示 JSON 数据。

www.json-behind-ntlm-authentication.com/view-data 

我现在正试图将它移动到 Java Servlet 中。

我已经测试了 HttpClient 库http://hc.apache.org,并且我从他们的文档中尝试过的每个示例都不起作用。我尝试过的大多数代码甚至都无法正确编译。

我还测试了 Jsoup,https: //jsoup.org/,因为这是一个非常好的网络抓取库,但这似乎不支持访问 NTLM 身份验证后面的页面。

我还测试了这里找到的代码,https://blogs.msdn.microsoft.com/freddyk/2010/01/19/connecting-to-nav-web-services-from-java/,这是唯一的代码示例我可以找到与访问位于 NTLM 身份验证后面的 JSON URL 相关的内容。这实际上是我想要实现的,一个 Java Web 应用程序通过他们的 Web 服务访问 Microsoft Nav 数据——甚至这个官方示例也无法编译。

任何指针/选项?一定有一个Java库可以解决这个问题吗?访问目前通过 HTTP,但出于安全原因最终将通过 SSL,因此任何解决方案都必须支持 SSL 握手。

我真的不想使用 LINQ 构建单独的 C# 应用程序,https: //blogs.msdn.microsoft.com/freddyk/2009/04/20/using-linq-with-nav-web-services/ ,我会希望有效,但我不希望 C# 示例基于未编译的 Java 示例在这种情况下工作。

更新

经过大量搜索后,我发现下面的代码似乎接近工作,但并不完全正常 - 请参阅代码中出现问题的注释。感谢评论中的指示。

DefaultHttpClient httpclient = new DefaultHttpClient();
            List<String> authpref = new ArrayList<String>();
            authpref.add(AuthPolicy.NTLM);
            httpclient.getParams().setParameter(AuthPNames.TARGET_AUTH_PREF, authpref); //ERROR - This causes an error: java.lang.VerifyError: Cannot inherit from final class
            NTCredentials creds = new NTCredentials(username, password, "", domain);
            httpclient.getCredentialsProvider().setCredentials(AuthScope.ANY, creds);
            HttpHost target = new HttpHost(baseURL);
            // Make sure the same context is used to execute logically related requests
            HttpContext localContext = new BasicHttpContext();
            // Execute a cheap method first. This will trigger NTLM authentication
            HttpGet httpget = new HttpGet(baseURL);
            HttpResponse response1 = httpclient.execute(target, httpget, localContext); //ERROR - This line is throwing an error: java.lang.VerifyError: Cannot inherit from final class
            HttpEntity entity = response1.getEntity();
            System.out.println(EntityUtils.toString(entity));

我仍然不确定如何实际解决这个问题。任何额外的指针?

4

1 回答 1

0

org.apache.http.auth可以NTCredentialsHttpComponentsMessageSender弹簧靴中使用@Configuration

HttpComponentsMessageSender httpComponentsMessageSender = new HttpComponentsMessageSender(); NTCredentials 凭据 = new NTCredentials("用户名", "密码", null, "域");

于 2017-11-09T13:47:41.590 回答