自动身份验证后将JSoup文档加载到webview

时间:2016-04-19 18:59:50

标签: android authentication webview base64 jsoup

我一直在不知疲倦地在我在大学使用的网站上学习和实施自动身份验证。我相信我现在已经成功设置了我的应用程序的自动身份验证部分,但是我现在不知道如何在他们通过登录阶段时向他们显示网站。我知道如何在自动身份验证之前执行此操作,但由于我已使用JSoup进行自动身份验证,因此我只剩下一个包含网页的Document变量。是否有可能现在将该文档加载到WebView中,以便用户继续使用该网站,就好像他们刚刚手动登录一样,或者我是否以错误的方式解决了这个问题?我也无法在我的线程上使用.join()方法,因为我没有处理错误,但我不确定我应该在何处或如何处理此InteruptException。

到目前为止,这是我的代码:

`

import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.CookieManager;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import org.apache.commons.codec.binary.Base64;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    private String url;
    private WebView web;
    private Document doc;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        web = (WebView) findViewById(R.id.webView);
        CookieManager.getInstance().setAcceptCookie(true);
        web.getSettings().setDomStorageEnabled(true);

        System.out.println("About to try!!!!!!!!");

        Thread thread = new Thread(new Runnable()
        {

            @Override
            public void run()
            {

                String username2 = "*********";
                String password2 = "*********";
                String login = username2 + ":" + password2;
                url = "https://hrorganiser.essex.ac.uk/";

                String base64login = new String(Base64.encodeBase64(login.getBytes()));

                try
                {
                    doc = Jsoup.connect(url).header("Authorization", "Basic " + base64login).get();

                    System.out.println(">> Connection Successful");
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                    System.out.println(">> Connection To "+url+" Failed");
                }
            }
        });

        thread.start();
        thread.join();
        if (doc == null) {
            System.out.println("Error Connecting...");
        } else {
            web.loadUrl(doc.html());
        }
    }
}`

1 个答案:

答案 0 :(得分:0)

使用Jsoup进行身份验证后,Jsoup的响应将包含来自服务器的 Cookie 。服务器为您提供此cookie以识别您并证明您是经过身份验证的用户。

在您的情况下,您只需要使用Jsoup 获取 Cookie并使您的WebView 使用 Cookie。

要获取Cookie,而不是

doc = Jsoup.connect(url).header("Authorization", "Basic " + base64login).get();

您需要

Connection.Response res = Jsoup.connect(url).header("Authorization", "Basic " + base64login).method(Method.GET).execute(); // you might need to use "Method.POST" for the parameter for method

然后获取Cookie

Map<String, String> cookies = res.cookies(); // get the cookie
Document doc =  res.parse(); // get the html document

现在您只需要使用此Cookie设置CookieManager,然后您就可以使用WebView作为登录用户。要详细了解如何让CookieManager使用此Cookie,请按照great answer here进行操作。您需要重新格式化您的cookiesstandard HTTP request header之后的String