所以我想做的是登录到我们公司使用的一个网络应用程序,我需要下载多个图表(确切地说是 45 个)我有一个程序可以完全按照我想要的方式执行此操作,但是我的代码的工作方式每次都必须登录。我不确定这是否是一个问题(对于网络应用程序的管理员来说可能看起来很可疑),但它似乎有点低效。理想情况下,我想登录该网站一次,然后它们就会移动到我下载图像所需的任何网址。你们能提供的任何帮助都会很棒。
for (int i = 1; i <= 45; i++) {
URL url;
if(i<10) {
url = new URL("http://127.0.0.1:3333/website/image0"+i);
}
else{
url = new URL("http://127.0.0.1:3333/website/image"+i);
}
String loginPassword = "usrName" + ":" + "PassWrd";
String encoded = new sun.misc.BASE64Encoder().encode(loginPassword.getBytes());
URLConnection conn = url.openConnection();
conn.setRequestProperty("Authorization", "Basic " + encoded);
String destName = "C:\\Users\\Name\\Documents\\Report\\p"+i+".png";
InputStream in = new BufferedInputStream(conn.getInputStream());
OutputStream os = new FileOutputStream(destName);
byte[] b = new byte[2048];
int length;
while ((length = in.read(b)) != -1) {
os.write(b, 0, length);
}
in.close();
os.close();
}
最佳答案
这很大程度上取决于您尝试获取图像的网站。大多数时候,网站会使用Cookies跟踪您已登录的事实。
Java 专门为此目的提供了一个类,可与 HttpUrlConnection 一起使用。 :CookieHandler
使用该类将默认处理程序设置为 CookieManager可能足以让您保持登录状态。如下所示:
CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));
// null for the CookieStore means CookieManager will use an in-memory implementation
// And CookiePolicy.ACCEPT_ALL means that this CookieHandler will accept
// all cookies
如果您的网站使用其他内容来识别其用户,您将必须对流程进行逆向工程并在您的程序中实现它。但一般来说,可以用浏览器完成的所有事情也可以用 Java 完成,所以它应该总是可行的。
编辑:写完这整件事后,我才意识到您的网站使用 HTTP 身份验证。在这种情况下,Cookie 实际上不会有帮助,因为无论如何您都已经重新授权了每个请求。 HTTP 本身没有状态,因此服务器根本不会记住您已经登录。如果这是用户访问这些图像的唯一方式,那么就不会有任何可疑之处,因为浏览器也必须在每次请求时重新发送用户名和密码。
我建议将编码后的字符串保存在某个地方,以免每次都重新生成它。
我仍然保留 Cookie 的问题,因为在身份验证机制不同的情况下它可能仍然有一些用处。
关于java - 如何使用 Java 登录网站并保持登录状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30484426/