Android - 在webview中登录后提取cookie

elg*_*oog 54 cookies android cookiestore android-webview

我有一个在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());
            }
        }
Run Code Online (Sandbox Code Playgroud)

mr.*_*fox 79

您可以通过这种方式从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);
}
Run Code Online (Sandbox Code Playgroud)

  • 导入 android.webkit.CookieManager; (2认同)

vim*_*083 26

这是一个很晚,但它可能会帮助一个人

您可以使用此获取cookie值

getCookie("http://www.example.com","cookieName");
Run Code Online (Sandbox Code Playgroud)

将函数声明为

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; 
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,当cookie值包含要查找的名称时,使用`contains`将找到错误条目:`FOO = BAR; BAR = FOO` (6认同)
  • @davehenry为避免这种情况,请为split方法添加第二个参数,如下所示:String [] temp1 = ar1.split("=",2); (2认同)
  • 正如@althaus所说,"如果(ar1.contains(CookieName)){"这是危险的,它可能会更好"if(ar1.indexOf(CookieName)== 0){"那么你确定你正在寻找这个名字的cookie而不是一些可能导致误报的中间字符串. (2认同)

Jua*_*dez 7

这个答案来自@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
}
Run Code Online (Sandbox Code Playgroud)