java - 如何使用 Java 登录网站并保持登录状态?

标签 java authentication apache-commons urlconnection

所以我想做的是登录到我们公司使用的一个网络应用程序,我需要下载多个图表(确切地说是 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/

相关文章:

java - 包含的启用 CDI 的 Servlet 失败,出现 ContextNotActiveException : WELD-001303:

java - 我想用 Java 代码在浏览器上打开链接或 URL

angular - 用户离线时如何使用 Angular PWA 处理身份验证?

java - 在 Java 中使用 `apache-commons` 、 `guava` 或其他一些流行的库将迭代器转换为可变列表的方法

daemon - Apache 公共(public)守护进程 "Failed creating Java"错误

java - 添加新对象与添加已创建对象的优先级队列

java - 如何在所需目录中打开文件对话框

django - 根据 Django 应用程序中的 Drupal 用户数据库表进行身份验证

apache - Apache 是否需要了解用于客户端身份验证的中间证书?

java - 公共(public)压缩 "will not fit in octal"