78

I have an application that opens a url in a webview, the user must then login to a site through the webview and receives a cookie once logged in. I'm having problems getting cookies after login.

The problem is, I can achieve this using android.webkit.CookieManager, and output all cookies in a single string.

However, I want to achieve it using the a cookie store (as in java.net.CookieStore) so I need to be using java.net.CookieManager.

I'm using the following code within the onPageFinished() of a WebViewClient. I know the issue is with opening a new connection, where I need to be getting the content from the current page. I'd appreciate some help, thanks

        @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());
            }
        }
elgoog
  • 1,031
  • 1
  • 11
  • 20
  • Already answered but for completeness and might help someone, check this answer http://stackoverflow.com/a/15924948/1714030 – Daniel Backman Aug 08 '14 at 22:42

5 Answers5

122

You can extract all cookies current url by this way from webview as string:

@Override
public void onPageFinished(WebView view, String url){
    String cookies = CookieManager.getInstance().getCookie(url);
    Log.d(TAG, "All the cookies in a string:" + cookies);
}
SBotirov
  • 13,872
  • 7
  • 59
  • 81
  • mrboyfox, do you have any idea about this : http://stackoverflow.com/questions/19256509/how-do-i-resolve-the-authentication-message-that-keeps-popping-up-in-a-webview/19256608?noredirect=1#comment28533391_19256608 –  Oct 10 '13 at 13:24
  • 1
    doesn't work when the page has a redirect through JS. onPageFinished is not called for every page. – Itay Bianco Nov 29 '18 at 15:21
  • @ItayBianco You can add another answer to your a situation if you have a solution too. It is will be great to developers which is looking solution to this a situation. – SBotirov Nov 29 '18 at 19:17
  • Does not work if cookie has SameSite flag. CookieManager just does not return that kind of cookie – Kalyaganov Alexey Aug 10 '19 at 05:59
  • 2
    import android.webkit.CookieManager; – MartianMartian May 07 '22 at 18:50
39

It was a quite late , but it might help someone

you can get the cookie value using this

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

Declare the function as

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; 
}
Phate P
  • 1,572
  • 1
  • 22
  • 31
vimal1083
  • 8,499
  • 6
  • 34
  • 50
7

This answer is derived from @vimal1083. It returns the values in a Map, and of course written in 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
}
Juan Mendez
  • 2,658
  • 1
  • 27
  • 23
2

Check this link - Pass cookies from HttpURLConnection (java.net.CookieManager) to WebView (android.webkit.CookieManager)

If you want to get cookies from webview, you will have to use android.webkit.CookieManager, from any HttpUrlConnection, however, you can extract cookies useing java.net.CookieStore

You will need to parse the string where you are getting all the cookies.

Community
  • 1
  • 1
Darpan
  • 5,623
  • 3
  • 48
  • 80
0

You can use this function to get a specific 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]
}
OhhhThatVarun
  • 3,981
  • 2
  • 26
  • 49