解决Android webview设置cookie和cookie丢失的问题
程序员文章站
2023-08-25 23:15:58
android页面嵌套了一个h5,h5页面内部有用户登陆页面,发现h5页面的登陆功能无法使用,一直登陆失败。和web那边商量一会,发现js写入的cookie丢失了。所有需要android这边在重写写入...
android页面嵌套了一个h5,h5页面内部有用户登陆页面,发现h5页面的登陆功能无法使用,一直登陆失败。和web那边商量一会,发现js写入的cookie丢失了。所有需要android这边在重写写入一次。
mwebview = view.findviewbyid(r.id.mall_view); settings = mwebview.getsettings(); settings.setjavascriptenabled(true); settings.setloadsimagesautomatically(true); settings.setdomstorageenabled(true); //不缓存 settings.setcachemode(websettings.load_no_cache); mwebview.setwebviewclient(new mywebviewclient()); class mywebviewclient extends webviewclient{ @override public boolean shouldoverrideurlloading(webview view, string url) { if (url != "") { //重点写入cookie hashmap<string, string> map = new hashmap<>(); map.put("referer", view.geturl()); view.loadurl(url, map); } return true; } @override public void onpagefinished(webview view, string url) { //获取登陆后的cookie,看是否写入 cookiemanager cookiemanager = cookiemanager.getinstance(); string cookiestr = cookiemanager.getcookie(url); super.onpagefinished(view, url); } }
以上就解决了登陆失败的问题!
还有就是登陆状态的同步,需要保存和设置cookie
/** * 获取接口中的cookie * @param loginurl */ private void synccookie(final string loginurl) { new thread(new runnable() { @override public void run() { try { stringbuilder builder = new stringbuilder(); url url= null; byte[] data = builder.tostring().getbytes("utf-8"); url = new url(loginurl); httpurlconnection connection = (httpurlconnection) url.openconnection(); connection.setdooutput(true); connection.setrequestproperty("content-type", "application/x-www-form-urlencoded"); connection.setrequestproperty("content-length", integer.tostring(data.length)); connection.setrequestmethod("get"); connection.setinstancefollowredirects(false); outputstream os = connection.getoutputstream(); os.write(data); os.close(); int arstcode = connection.getresponsecode(); if (arstcode == httpurlconnection.http_ok) { cookie = connection.getheaderfield("set-cookie"); } } catch (malformedurlexception e) { e.printstacktrace(); } catch (unsupportedencodingexception e) { e.printstacktrace(); } catch (protocolexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } } }).start(); } //设置cookie if(cookie != null && cookie.length() > 0){ android.webkit.cookiemanager cookiemanager = android.webkit.cookiemanager.getinstance(); cookiemanager.setacceptcookie(true); cookiemanager.setcookie(sysparam.shoppingmall, cookie); cookiesyncmanager.getinstance().sync(); }
补充知识:android webview带cookie访问url
问题描述
在原生和h5混合开发的时候会遇到这么一个问题,用webview加载某个url时,你只是app登录了账号,但是网页却没有,所有会禁止访问此url,webview就会显示白屏。
所以要访问此url,需要带上cookie进行访问。这个cookie就是用app登录时所存储的cookie
实现方法和一些环境
网络请求方式
httpsurlconnection
这里既然用到了httpsurlconnection 说明我所加载的url是https协议
所以webview加载的时候会白屏
报错信息:
1
这是由于证书和域名不匹配,我的调试环境在内网服务器上,而证书是绑定在公网的域名上的。
所以需要webview跳过证书验证,
跳过证书验证
webview.setwebviewclient(new webviewclient() { @override public void onreceivedsslerror(webview view, sslerrorhandler handler, sslerror error) { log.e("app_name",error.tostring()); handler.proceed(); } });
然后设置cookie
cookie是在app使用httpsurlconnect发起登录请求时保存在本地的cookie
app登录成功后保存cookie到本地
sharedpreferences sharedpreferences = getsharedpreferences("login",mode_private); sharedpreferences.editor editor = sharedpreferences.edit(); string cookieval = conn.getheaderfield("set-cookie"); editor.putstring("all_cookie",cookieval);
是一个结构如下的值:
session=f19b09e9-69b2-4ab4-9daf-ea224523a092; path=/; secure; httponly
写入cookie
/** *@param cookie 上面获取到的存储在本地的cookie字符串 *@param url 要加载的页面url */ private void setcookie(string cookie,string url) { string stringcookie = cookie; cookiemanager cookiemanager = cookiemanager.getinstance(); if (build.version.sdk_int >= build.version_codes.lollipop) { cookiemanager.removesessioncookies(null); cookiemanager.flush(); } else { cookiemanager.removesessioncookie(); cookiesyncmanager.getinstance().sync(); } cookiemanager.setacceptcookie(true); cookiemanager.setcookie(url, stringcookie); }
所有关键代码
sharedpreferences sharedpreferences = getsharedpreferences("login",mode_private); string cookie = sharedpreferences.getstring("session",""); string all_cookie = sharedpreferences.getstring("all_cookie",""); log.e("weibiao",all_cookie); webview = findviewbyid(r.id.other_account_service_webview); webview.setwebviewclient(new webviewclient() { @override public void onreceivedsslerror(webview view, sslerrorhandler handler, sslerror error) { log.e("weibiao",error.tostring()); handler.proceed(); } }); initwebviewsettings();//webview的一些设置 setcookie(all_cookie,url);//在loadurl之前调用此方法 webview.loadurl(url);
以上这篇解决android webview设置cookie和cookie丢失的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
推荐阅读
-
基于axios 解决跨域cookie丢失的问题
-
解决Android webview设置cookie和cookie丢失的问题
-
Ajax跨域访问Cookie丢失问题的解决方法
-
Android webView 获取、设置 cookie的方法
-
基于axios 解决跨域cookie丢失的问题
-
意外的头部空白行或输出和Cookie设置问题
-
意外的头部空白行或输出和Cookie设置问题
-
解决Android webview设置cookie和cookie丢失的问题
-
Android Studio 界面布局之xml文件中给输入框editText修改下划线颜色 / 为按钮设置圆角和颜色 / 约束布局预览效果和运行效果不一致 问题的解决
-
意外的头部空白行或输出和Cookie设置问题_PHP教程