how i can load a page in android WebView with cookies? - android

i have cookies,want to send the cookie to WebView,how i can do?
i use JSOUP to get cookies from login page and i use the follow code but not working
webview.LoadUrl(URL, Cookies)

I had to do something like this a couple of weeks ago. I ditched the webview though and used a recyclerview for the info because of data and ram consumption.
res = Jsoup.connect(url)
.data("user", user, "passwrd", pass)
.method(Connection.Method.POST)
.execute();
String sessionId = res.cookie("PHPSESSID");
The code up there is actually from Jsoup's creator himself on how to store cookies. Then its a matter of setting the cookiemanager to these cookies.
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.setCookie(url,String.format("%s=%s",
"PHPSESSID", sessionId));
Then I just loaded the webview. I think a really important line here is formatting the string in the second parameter of the setCookie() method to match how the cookie is actually a Map with a key and value of PHPSESSID and the cookies characters. PHPSESSID is the id name that shows up for me in the cookie.

Related

Multiple cookies in CookieManager

Lets prepare for cookie storing:
CookieSyncManager.createInstance(getApplicationContext());
CookieSyncManager.getInstance().startSync();
CookieManager.getInstance().setAcceptCookie(true);
Then I'm putting manually some cookies, lets say PHPSESSID and RANDOM
CookieManager.getInstance().setCookie("domain.com", "PHPSESSID="+phpSession);
CookieManager.getInstance().setCookie("domain.com", "RANDOM="+random);
lets check is it working using:
CookieManager.getInstance().getCookie("domain.com");
and got
PHPSESSID=dba4ff392agd39b5951d10a91a0a7b56; RANDOM=266284790:1466147978:c91d0896bac59e0b
Everything looks good, but when I navigate in may app to one of WebView Activities, which are opening same domain website also setting cookies, then when I print cookie like above it looks like this:
PHPSESSID=dba4ff392agd39b5951d10a91a0a7b56;
RANDOM=266284790:1466147978:c91d0896bac59e0b;
PHPSESSID=9ecb5156cf8fc3190fbc69fd13393243;
RANDOM=265078219%3A1463147975%3Ad0448d163e9b2123
duplicated entries... when after that I manually set again e.g. RANDOM with setCookie:
PHPSESSID=dba4ff392agd39b5951d10a91a0a7b56;
RANDOM=111111111:2222222222:33333336bac59e0b;
PHPSESSID=9ecb5156cf8fc3190fbc69fd13393243;
RANDOM=265078219%3A1463147975%3Ad0448d163e9b2123
values set by WebView are not overwritten, only my "manually" entered... how to force WebView to use my earlier set cookie OR overwrite already set?
As in the MDN docs about Set-Cookie you can see many different kinds of cookie values, a cookie can be set to particular Path
cookie-name=cookie-value; Path=path-value
And in CookieManager.setCookie void setCookie (String url, String value), the android reference says:
Sets a cookie for the given URL. Any existing cookie with the same host, path and name will be replaced with the new cookie. The cookie being set will be ignored if it is expired.
In my opinion, the reason that you have duplicate entries is because the cookie values were in different Path. So if you want to overwrite you should make sure host path name are the same.
private void setCookieManager(String auth_token) {
CookieSyncManager manager = CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();
cookieManager.setCookie(auth_token);
manager.sync();
}
I think you just didn't setup your cookie manager properly. Give this a try

DefaultHttpClient post get session cookie and pass to WebView android

I've found a few answers to this question here on SO, but I'm not having success implementing them so hoped that someone could check over my code and tell me where i'm going wrong.
I have verified that my cookie is being set from the DefaultHttpClient and am writing it out with Log.d as you can see in my code snippet below. It's all there, it's just not getting set for the WebView which is called at the bottom of this code segment. The cookie being passed down is a session cookie from my Asp.net mvc project. Any ideas why it's not keeping me logged in when the WebView hits the site? Don't let the facebook wording throw you off, that I all have working, this cookie is for my own server that is passing down a session cookie to keep me logged into my own site (based on my facebook stuff).
Cookie sessionCookie = FacebookLoginService.cookie;
Log.d("intialwebview",sessionCookie.toString());
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
if (sessionCookie != null) {
cookieManager.removeSessionCookie();
String cookieString = sessionCookie.getName() + "=" + sessionCookie.getValue() + "; domain=" + sessionCookie.getDomain();
Log.d("intialwebview",cookieString);
cookieManager.setCookie(FacebookLoginService.cookie.getDomain(), cookieString);
CookieSyncManager.getInstance().sync();
}
//end cookie section
int userId = prefs.getInt(C.USER_ID, 0);
webView = (WebView) findViewById(R.id.web_view);
webView.getSettings().setUserAgentString(webView.getSettings().getUserAgentString() + "(Rambo)");
webView.getSettings().setJavaScriptEnabled(true);
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
webView.loadUrl(C.BaseUrl + "home/firstpage");
EDIT: I also tried creating the web view in code with:
WebView webView = new WebView(this);
same result. Cookie isn't being sent to the webview.
finally got this sorted by using an Asynctask and running a sleep in the background.
You have used this line -
if (sessionCookie != null) {
cookieManager.removeSessionCookie();
}
To ensure you receive new cookie everytime.
Seems like you have gone through same issue
as I faced, check below link -
removeSessionCookie() issue of android, (code.google.com)
it says that removeSessionCookie() is implemented in a thread, so whenever it is
called; a thread starts and after your setCookie(url, cookieString); is called,
it removes the new cookie you just set.
So for some devices it works well as removeSessionCookie() is already executed,
while, for some, it remove the cookie, and we get that problem.
I suggest you remove this removeSessionCookie(); as you are setting only one cookie, so it won't conflict with other cookies. Your code will work seamlessly.

Jsoup cookie authentication from cookiesyncmanager to scrape from https site

I have an android application using a webview on which the user has to log in with username and password before being redirected to the page i would like to scrape data off with jsoup. Since the jsoup thread would be a different session the user would have to login again.
Now i would like to use the cookie received from the webview to send with the jsoup request to be able to scrape my data.
The cookie is being synced with cookiesyncmanager with following code. This is basically where I am stuck cause i dont know how to read out the cookie nor how to attach it to the jsoup request. Please help? :)
public void onPageFinished(WebView view, String url) {
CookieSyncManager.getInstance().sync();
The jsoup scrape I am doing after the user has logged in with something like this:
doc = Jsoup.connect("https://need.authentication.com").get();
Elements elements = doc.select("span.tabCount");
Element count = elements.first();
Log.d(TAG, "test"+(count));
I'm not an android developer but maybe you can try something like this:
final String url = "https://need.authentication.com";
// -- Android Cookie part here --
CookieSyncManager.getInstance().sync();
CookieManager cm = CookieManager.getInstance();
String cookie = cm.getCookie(url); // returns cookie for url
// ...
// -- JSoup part here --
// Jsoup uses cookies as "name/value pairs"
doc = Jsoup.connect("https://need.authentication.com").header("Cookie", cookie).get();
// ...
I hope this helps a bit, but as i said before: im no android developer (and code isn't tested!)
Here's some documentation:
CookieManager
CookieSyncManager
Jsoup Connection

setting Cookies in WebView android

I'm trying to set some cookies on my WebView to open a browser with the same session that I have on my app.
I read a lot of answers but they don't work for me. The only solution I've found is in the loadUrl, hardcode the cookie data in extraHeaders, but as expected this only works for this requests, and doesn't maintain the session.
The code that I have is:
CookieSyncManager cookieSyncManager = CookieSyncManager.createInstance(mWebView.getContext());
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();
cookieManager.setCookie("http://xx.xxx.example.com","mid="+MySession.GetSession().sessionId+" ; Domain=.example.com");
cookieSyncManager.sync();
String cookie = cookieManager.getCookie("http://xx.xxx.example.com");
Log.d(LOGTAG, "cookie ------>"+cookie);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebViewClient(new TuWebViewClient());
mWebView.loadUrl("http://xx.xx.example.com");
getCookie() returns the correct data, but when I read the cookies from the server, those are empty. What is wrong? Please advise.
Thank you!!!
Solved!!!! the problem is with the webView, I dont know what happend, but If I create the
WebView webView = new WebView(Activity.this);
it works. If I read the webview from activity with findViewById() it doesn't work.
Also if you need to set a list of cookies that you received previously from a website.
All you have to do is use a for-loop to go through and set all of them . It helped me to solve the situation
CookieSyncManager cookieSyncManager = CookieSyncManager.createInstance(mWebView.getContext());
...
cookieSyncManager.sync();
is the cause of problem. You should do like this:
CookieSyncManager.createInstance(mWebView.getContext());
...
CookieSyncManager.getInstance().sync();
And there will be no need to manually create WebView...

The cookie value shows, but doesn't get logged in - WebView inject cookie

I have trouble passing the cookie into the WebView inject. I know how to inject the cookie. When the cookie is injected I want to display a member.php and this page requires a cookie. It shows me the error page even if I've injected the cookie.
The WebView are correctly loaded and I've tried to set a cookie using the CookieManager class. Alll this is known to me.
From the CookieStore I have tried to print out the whole cookie itself; which prints this:
[[version: 0][name:SQMSESSID][value: 9166729532c975f261bda9e6e583bdba]
[domain: mydomain.com][path: /][expiry: null], [version: 0][name: key]
[value: vrckNRab][domain: mydomain.com][path: /][expiry: null]]
Should be mentioned that the code above is the successful CookieStore when I have passed my correct username and password.
My inject + loadUrl code:
CookieStore cookie = /* CookieStore cookie takes a CookieStore from my
own function that succesful returns the CookieStore */
List<Cookie> listcookie = cookie.getCookies(); //Set my CookieStore to a list
Cookie setcookieOne = listcookie.get(0) //My cookie has two fields
Cookie setcookieTwo = listcookie.get(1) //....and assign these to a cookie
CookieManager cookieManager = CookieManager.getInstance();
CookieSyncManager.createInstance(getApplicationContext());
cookieManager.setAcceptCookie(true);
cookieManager.setCookie(setcookieOne.getDomain(), setcookieOne.getValue());
cookieManager.setCookie(setcookieTwo.getDomain(), setcookieTwo.getValue());
CookieSyncManager.getInstance().sync();
browse.setWebViewClient(new WebViewClient(){
});
browse.loadUrl("http://mypagethatwillredirectmeonacorrectcookie.php"); /* This
page will redirect if the cookie is successful */
Any ideas why it doesn't show the member.php?
First, make sure that getValue() on a Cookie returns what setCookie() on a CookieManager requires. CookieManager needs "The value for set-cookie: in http response header"; Cookie's getValue() I suspect returns only the actual value (9166729532c975f261bda9e6e583bdba in your example).
Second, never use getApplicationContext(), particularly for GUI operations. Use your Activity instead, since Activity is a subclass of Context.

Categories

Resources