HttpURLConnection 中的 NTLM 身份验证在 JRE 中不起作用

我正在使用 eclipse 开发应用程序的两个部分。

Web 部件提供 REST 服务并过滤对服务的请求,使用waffle.servlet.NegotiateSecurityFilter它提取 Windows 登录信息以识别用户。

客户端部件用于HttpURLConnection向 Web 部件发送请求。据我了解,Ntlm 信息会自动打包到请求中。

当我在 Eclipse 中测试它时,它运行良好。当我部署客户端 JAR 时,它不起作用。我得到一个 401 Not Authenticated。

经过一番调查,我发现我可以通过将执行环境设置为 JRE 而不是默认的 JDK 在 eclipe 中重现这一点。

我安装了 JRE“1.8.0_201”和 JDK“1.8.0_161”。

因此,只需将执行环境从 JRE 更改为 JDK,我就可以获得连接以进行身份验证。

JDK 有什么不同,我可以做些什么来让客户端使用 JRE?


烙印99
浏览 157回答 2
2回答

慕村225694

我认为如何在调用任何 url 时提供 ntlm 身份验证的第一个答案?可以回答这个问题。在 Java 8u201 中,有一个新的 JRE 选项jdk.http.ntlm.transparentAuth,默认设置为禁用

至尊宝的传说

我没有找到 JRE 和 JDK 之间的区别。相反,我发现了这个解决方法。<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --><dependency>&nbsp; &nbsp; <groupId>org.apache.httpcomponents</groupId>&nbsp; &nbsp; <artifactId>httpclient</artifactId>&nbsp; &nbsp; <version>4.5.7</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient-win --><dependency>&nbsp; &nbsp; <groupId>org.apache.httpcomponents</groupId>&nbsp; &nbsp; <artifactId>httpclient-win</artifactId>&nbsp; &nbsp; <version>4.5.7</version></dependency>示例代码&nbsp; &nbsp; &nbsp; &nbsp; if (!WinHttpClients.isWinAuthAvailable()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.warn("Integrated Win auth is not supported!!!");&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; // There is no need to provide user credentials&nbsp; &nbsp; &nbsp; &nbsp; // HttpClient will attempt to access current user security context through&nbsp; &nbsp; &nbsp; &nbsp; // Windows platform specific methods via JNI.&nbsp; &nbsp; &nbsp; &nbsp; try (CloseableHttpClient httpclient = WinHttpClients.createDefault()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HttpGet httpget = new HttpGet(getRestUrl().toURI());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.debug("Executing request " + httpget.getRequestLine());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try (CloseableHttpResponse response = httpclient.execute(httpget)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int status = response&nbsp; &nbsp;.getStatusLine()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .getStatusCode();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (status != 200) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.error("HTTP error " + status);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new RuntimeException("Failed : HTTP error code : " + status);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Type listType = new TypeToken<HashMap<String, App>>() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }.getType();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return new Gson().fromJson(new InputStreamReader(response&nbsp; &nbsp;.getEntity()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .getContent(),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "UTF-8"), listType);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java