问题描述
我有一个Spring Boot应用程序,它需要读取一个XML文件,该文件可以在线(通过https)访问,但需要登录(如果有帮助,它由Redmine API生成)。我有一个经过测试且可以使用用户名和密码的帐户,并且可以正常工作(可以通过浏览器登录),并且尝试使用JCIFS,如下所示,但是我遇到了“连接超时”错误(该XML文件肯定位于时间)。我在做什么错了?
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null,USERNAME,PASSWORD);
try (InputStream is = new SmbFile("https://mypath/issues.xml?limit=100",auth).getInputStream()) {
System.out.println(is.toString());
} catch (IOException e) {
// Handle IOException
}
解决方法
您可以在没有任何第三方库的情况下完成此操作,请参阅此博客文章:
https://www.baeldung.com/java-http-url-connection
和一个简短示例:
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class AuthenticationTest {
public static void main(String[] args) throws IOException {
String url = "https://mypath/issues.xml?limit=100";
String user = "user";
String password = "pass";
String auth = user + ":" + password;
byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes(StandardCharsets.UTF_8));
String authHeaderValue = "Basic " + new String(encodedAuth);
char[] buffer = new char[1024];
int len = -1;
URLConnection connection = new URL(url).openConnection();
connection.setRequestProperty("Authorization",authHeaderValue);
try (Reader reader = new InputStreamReader(connection.getInputStream())) {
StringBuilder builder = new StringBuilder();
while ((len = reader.read(buffer)) != -1) {
builder.append(buffer,len);
}
System.out.println(builder.toString());
}
}
}