如何在Java Servlet或类中请求外部JSON URL当JSON URL位于另一个服务器/域上的NTLM身份验证后

时间:2017-11-09 13:17:51

标签: java apache-httpclient-4.x ntlm ntlmv2 ntlm-authentication

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

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

我现在正试图将其转移到Java Servlet中。

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

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

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

任何指针/选项?某个地方必须有一个Java库才能解决这个问题?访问当前是通过HTTP进行的,但出于安全原因最终将通过SSL进行访问,因此任何解决方案都必须支持SSL握手。

我真的不想使用LINQ https://blogs.msdn.microsoft.com/freddyk/2009/04/20/using-linq-with-nav-web-services/来构建一个单独的C#应用​​程序,我希望它可以工作,但是我不希望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));

我仍然不确定如何真正解决这个问题。还有其他指示吗?

1 个答案:

答案 0 :(得分:0)

org.apache.http.authNTCredentials您可以在HttpComponentsMessageSender的春季启动中使用@Configuration

HttpComponentsMessageSender httpComponentsMessageSender = new HttpComponentsMessageSender(); NTCredentials凭据=新的NTCredentials(“用户名”,“密码”,null,“域”);