Android-在webview中登录后提取Cookie

Android-在webview中登录后提取Cookie,android,cookies,android-webview,cookiestore,Android,Cookies,Android Webview,Cookiestore,我有一个在webview中打开url的应用程序,用户必须通过webview登录到站点,并在登录后接收cookie。我在登录后获取cookies时遇到问题 问题是,我可以使用android.webkit.CookieManager实现这一点,并在单个字符串中输出所有cookie 但是,我想使用cookie存储实现它(如在java.net.CookieStore中),所以我需要使用java.net.CookieManager 我在WebViewClient的onPageFinished()中使用以下

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

问题是,我可以使用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());
            }
        }
@覆盖
公共void onPageFinished(WebView视图,字符串url){
Log.d(标记“已完成加载:”+url);
CookieSyncManager-syncManager=CookieSyncManager.createInstance(Main.this);
syncManager.sync();
CookieManager=新建CookieManager();
manager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
setDefault(管理器);
试一试{
URL blah=新URL(URL);
HttpURLConnection con=(HttpURLConnection)blah.openConnection();
readStream(con.getInputStream());//输出html
} 
捕获(例外e){
}
CookieStore cookieJar=manager.getCookieStore();
List cookies=cookieJar.getCookies();
用于(HttpCookie cookie:cookies){
Log.d(标记“cookie名称:”+cookie.getName().toString());
}
}

您可以通过以下方式从webview中提取当前url中的所有Cookie作为字符串:

@Override
public void onPageFinished(WebView view, String url){
    String cookies = CookieManager.getInstance().getCookie(url);
    Log.d(TAG, "All the cookies in a string:" + cookies);
}
检查此链接-

如果您想从webview获取Cookie,您必须从任何
HttpUrlConnection
使用
android.webkit.CookieManager
,但是,您可以使用
java.net.CookieStore


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

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

您可以使用以下命令获取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; 
}

这个答案来自@vimal1083。它返回
映射中的值
,当然,它是用
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
}
fun getCookieMap(siteName:String):地图{
val manager=CookieManager.getInstance()
val map=mutableMapOf()
manager.getCookie(siteName)?。让{cookies->
val typedArray=cookies.split(;”.toRegex()).dropLastWhile{it.isEmpty()}.toTypedArray()
for(类型Darray中的元素){
val split=element.split(“=”.toRegex()).dropLastWhile{it.isEmpty()}.toTypedArray()
如果(split.size>=2){
map[split[0]]=split[1]
}else if(split.size==1){
映射[拆分[0]]=“”
}
}
}
返回图
}

BoyFox先生,你知道这一点吗:当页面通过JS重定向时不起作用。并非每一页都调用onPageFinished。@ItayBianco如果您也有解决方案,您可以为您的a情况添加另一个答案。这将是伟大的开发人员正在寻找解决方案,这种情况。不工作,如果cookie有相同的标志。CookieManager只是不返回已经回答过的那种CookieManager,但为了完整性和可能帮助他人,请检查此答案为什么在那些用于拆分字符串的正则表达式中需要[]?@RaduSimionescu它们对我来说似乎没有必要,但它们不会造成伤害,注意,当cookie值包含要查找的名称时,使用
contains
将查找错误条目:
FOO=BAR;BAR=FOO
@davehenry为了避免这种情况,在split方法中添加第二个参数,如下所示:String[]temp1=ar1.split(“=”,2);正如@althaus所说,“如果(ar1.contains(CookieName)){”这是危险的,它可能更好“如果(ar1.indexOf(CookieName)==0{”,那么您要确保查找的是cookie的名称,而不是可能导致误报的中间字符串。