I'm getting a HttpResponse
from a server when checking if a username or password is correct.
When I load the url
in a webview
I want the webView
to have the cookie (the answer I get with postData()
stored in the webView
.
I want the webView to pickup the cookie and load the url with that cookie stored in the webview.
I'm getting the response through.
public HttpResponse postData() {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("https://example.com/login.aspx");
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("txtUsername", "user"));
nameValuePairs.add(new BasicNameValuePair("txtPassword", "123"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
String responseAsText = EntityUtils.toString(response.getEntity());
Log.v(TAG , "Response from req: " + responseAsText);
return responseAsText;
} catch (ClientProtocolException e) {
} catch (IOException e) {
}
return null;
}
And I loadUrl with:
webView.loadUrl("http://a_page.com/getpage.aspx?p=home");
I guess I'm not really managing a cookie and I have no idea how to do so.
Any suggestions or solutions?
You'll probably want to take a look at this solution: Android WebView Cookie Problem
It's quite simple really.
String cookieString = "cookie_name=cookie_value; path=/";
CookieManager.getInstance().setCookie(baseUrl, cookieString);
where cookieString
is formatted the same as a more traditional Set-Cookie
HTTP header, and baseUrl
is the site the cookie should belong to.
Couple of comments which I found out from my experience and gave me headaches:
http
and https
urls are different. Setting a cookie for http://www.example.com
is different than setting a cookie for https://www.example.com
- A slash in the end of the url can also make a difference. In my case
https://www.example.com/
works but https://www.example.com
does not work.
CookieManager.getInstance().setCookie
is performing an asynchronous operation. So, if you load a url right away after you set it, it is not guaranteed that the cookies will have already been written. To prevent unexpected and unstable behaviours, use the CookieManager#setCookie(String url, String value, ValueCallback callback) (link) and start loading the url after the callback will be called.
I hope my two cents save some time from some people so you won't have to face the same problems like I did.
Just wanna throw another way how this can be done. Not saying it is the best, but it is a way. You can use JavaScript to set cookies as well. Just override onPageFinished
in WebViewClient
new WebViewClient() {
override fun onPageFinished(view: WebView, url: String) {
val javascript = """document.cookie = "key=$value""""
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
view.evaluateJavascript(javascript) { s -> Timber.d("Inject: %s", s) }
} else {
view.loadUrl("javascript:" + javascript, null)
}
}
}
One thing with this approach: you will have to reload the webView. If anyone knows how to fix that, please comment.