70

我有一个应用程序在 webview 中打开一个 url,然后用户必须通过 webview 登录到一个站点并在登录后接收一个 cookie。我在登录后获取 cookie 时遇到问题。

问题是,我可以使用 android.webkit.CookieManager 实现这一点,并在单个字符串中输出所有 cookie。

但是,我想使用 cookie 存储(如在 java.net.CookieStore 中)来实现它,所以我需要使用 java.net.CookieManager。

我在 WebViewClient 的 onPageFinished() 中使用以下代码。我知道问题在于打开一个新连接,我需要从当前页面获取内容。我会很感激一些帮助,谢谢

        @Override
        public void onPageFinished(WebView view, String url){

            Log.d(TAG, "Finished loading: " + url);

            CookieSyncManager syncManager = CookieSyncManager.createInstance(Main.this);
            syncManager.sync();

            CookieManager manager = new CookieManager();
            manager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
            CookieHandler.setDefault(manager);

            try {
                URL blah = new URL(url);
                HttpURLConnection con = (HttpURLConnection) blah.openConnection();
                readStream(con.getInputStream()); // outputting html
            } 
            catch (Exception e) {
            }

            CookieStore cookieJar = manager.getCookieStore();
            List<HttpCookie> cookies = cookieJar.getCookies();

            for (HttpCookie cookie: cookies) {
                Log.d(TAG, "cookie name : "+cookie.getName().toString());
            }
        }
4

5 回答 5

107

您可以通过这种方式从 webview 中提取所有 cookie 当前 url 作为字符串:

@Override
public void onPageFinished(WebView view, String url){
    String cookies = CookieManager.getInstance().getCookie(url);
    Log.d(TAG, "All the cookies in a string:" + cookies);
}
于 2013-04-04T04:52:48.287 回答
34

已经很晚了,但它可能会对某人有所帮助

您可以使用此获取 cookie 值

getCookie("http://www.example.com","cookieName");

将函数声明为

public String getCookie(String siteName,String cookieName){     
    String CookieValue = null;

    CookieManager cookieManager = CookieManager.getInstance();
    String cookies = cookieManager.getCookie(siteName);       
    String[] temp=cookies.split(";");
    for (String ar1 : temp ){
        if(ar1.contains(cookieName)){
            String[] temp1=ar1.split("=");
            CookieValue = temp1[1];
            break;
        }
    }              
    return CookieValue; 
}
于 2013-11-27T12:01:07.440 回答
4

这个答案来自@vimal1083。它返回 a 中的值Map,当然也写入Kotlin.

fun getCookieMap(siteName: String): Map<String,String> {

    val manager = CookieManager.getInstance()
    val map = mutableMapOf<String,String>()

    manager.getCookie(siteName)?.let {cookies ->
        val typedArray = cookies.split(";".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
        for (element in typedArray) {
            val split = element.split("=".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()

            if(split.size >= 2) {
                map[split[0]] = split[1]
            } else if(split.size == 1) {
                map[split[0]] = ""
            }
        }
    }

    return map
}
于 2019-05-09T21:45:00.420 回答
1

检查此链接 - 将 Cookie 从 HttpURLConnection (java.net.CookieManager) 传递到 WebView (android.webkit.CookieManager)

如果您想从 webview 获取 cookie,则必须使用android.webkit.CookieManager, from any HttpUrlConnection,但是,您可以使用提取 cookiejava.net.CookieStore

您将需要解析获取所有 cookie 的字符串。

于 2013-07-26T07:39:40.350 回答
0

您可以使用此功能获取特定的cookie

fun getCookie(name: String): String? {
    val cookies = cookieManager.getCookie("YOUR_URL_HERE")
    if (cookies == null || !cookies.contains("${name}=")) {
        return null
    }
    return cookies.split("${name}=")[1].split(";")[0]
}
于 2021-12-24T08:10:53.670 回答