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

时间:2015-05-27 13:48:08

标签: 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();
            }

1 个答案:

答案 0 :(得分:0)

这在很大程度上取决于您尝试获取图像的网站。大多数情况下,网站将使用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本身没有状态,因此服务器根本不会记住您已经登录。如果这是用户可以访问这些图像的唯一方式,那么就没有任何可疑之处,因为浏览器也必须为每个请求重新发送用户名和密码。

我建议将编码的String保存到某处,以免每次都重新生成。

我仍然会保留Cookie,因为如果身份验证机制不同,可能还会有一些用处。