最近有个需求是这样的:在应用中添加一个商城,商城的实现是H5(包括登录)。需要将这个H5嵌到原生应用中,并在原生代码中添加支付功能。

接到这个需求的时候,想这不是很简单么,用WebView加载这个页面,通过Js回调原生方法,然后调用第三方支付,完工。

然而到实际开发的时候,问题就出现了。

首先的问题是:

1.在商城中,点击了一个商品,然后确认购买。

2.此时没有登录,会跳到登录界面。

3.没关系,那就登录一下。

4.登录完后,再次点击这个商品,然后去购买。

5.然后问题就出现了,前面不是登录过了吗?怎么还跳到登录界面了?

分析:

一开始以为是H5写的不对,然而我用浏览器打开的时候,是好的,跳转也正常,所以,还是WebView设置的有问题。

一通百度之后,初步断定是Cookie同步的问题,但是网络这一块一直不太懂,当下也没时间细细研究,所以就照着百度所得之后一步步尝试。下面是我的解决方法。

解决方法:

  • 初始化WebView
private void initWebView() {
WebSettings webSettings = webview.getSettings();
// 设置编码
webSettings.setDefaultTextEncodingName("utf-8");
webSettings.setTextZoom(100);
//自适应屏幕
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
webSettings.setLoadWithOverviewMode(true); // 支持js
webSettings.setJavaScriptEnabled(true); // 设置本地调用对象及其接口
jsBridge = new JavaScriptBridge(getActivity(), webview);
webview.addJavascriptInterface(jsBridge, "Native"); CookieManager mCookieManager = CookieManager.getInstance();
mCookieManager.setAcceptCookie(true);
mCookieManager.setAcceptThirdPartyCookies(webview, true);
webview.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
} @Override
public void onPageFinished(WebView view, String url) {
// //获取webview里面的cookie信息
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
String cookieStr = cookieManager.getCookie(url);
saveCookies(cookieStr);
progressBar.setVisibility(View.GONE);
} @Override
public void onReceivedError(WebView view, int errorCode, String description, final String failingUrl) {
} public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("http") || url.startsWith("https")) {
if (url.startsWith("http://shop.yinm")) { //这个WebView是通用的,只对这个商城的链接做Cookie操作。
syncCookie(getContext(), url);
}
view.loadUrl(url);
return false;
} else {
//其他的URL则会开启一个Acitity然后去调用原生APP
try {
Intent in = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(in);
view.stopLoading();
}catch (Exception e) {
e.printStackTrace();
}
return true;
}
}
});
}
  • 在onPageFinished的时候,保存Cookie
    private void saveCookies(String cookieString) {
sp.edit().putString("cook", cookieString).apply();
}
  • 在loadUrl(url)前,同步Cookie
    private void syncCookie(Context context, String url){
try{
CookieSyncManager.createInstance(context); CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();// 移除 //log
String oldCookie = cookieManager.getCookie(url);
if(oldCookie != null){
android.util.Log.i("zxy", "getCookie oldCookie " + oldCookie);
} String cookie = sp.getString("cook", "");
String[] cookies = cookie.split(";");
if (!TextUtils.isEmpty(cookie)) {
for (String cook : cookies) {
cookieManager.setCookie(url, cook.trim()); //一定要一个一个set, 如果是拼接的话,设置不成功。
}
} //最后一定要调用
CookieSyncManager.getInstance().sync(); //log
String newCookie = cookieManager.getCookie(url);
if(newCookie != null){
android.util.Log.i("zxy", "getCookie newCookie " + newCookie);
}
}catch(Exception e){
android.util.Log.i("zxy", "getCookie failed" + e.toString());
}
}

这样,就可以实现Cookie同步了。

(网路这一块,找个时间要好好补补)

Android WebView 保持登录问题的更多相关文章

  1. Android WebView 302斗争之旅

    一.背景 越来越多的业务接入,项目内多多少少会出现几个H5页面,只是单纯的提供WebView容器接入H5页面根本满足不了需求,他们需要登录态,需要制定协议控制Native的导航栏,或者需要JsBrid ...

  2. Android WebView 开发详解(二)

    转载请注明出处  http://blog.csdn.net/typename/article/details/39495409 powered by miechal zhao   概览: Androi ...

  3. Android WebView存在跨域访问漏洞(CNVD-2017-36682)介绍及解决

    Android WebView存在跨域访问漏洞(CNVD-2017-36682).攻击者利用该漏洞,可远程获取用户隐私数据(包括手机应用数据.照片.文档等敏感信息),还可窃取用户登录凭证,在受害者毫无 ...

  4. webview之如何设计一个优雅健壮的Android WebView?(下)(转)

    转载:https://iluhcm.com/2018/02/27/design-an-elegant-and-powerful-android-webview-part-two/ (这篇文章写得有点晚 ...

  5. webview之如何设计一个优雅健壮的Android WebView?(上)(转)

    转接:https://iluhcm.com/2017/12/10/design-an-elegant-and-powerful-android-webview-part-one/ 前言 Android ...

  6. Android WebView 详解

    相关API 相关类介绍 WebResourceRequest 添加于API21,封装了一个Web资源的请求信息,包含:请求地址,请求方法,请求头,是否主框架,是否用户点击,是否重定向 WebResou ...

  7. 如何设计一个优雅健壮的Android WebView?(下)

    转:如何设计一个优雅健壮的Android WebView?(下) 前言 在上文<如何设计一个优雅健壮的Android WebView?(上)>中,笔者分析了国内WebView的现状,以及在 ...

  8. 如何设计一个优雅健壮的Android WebView?(上)

    转:如何设计一个优雅健壮的Android WebView?(上) 前言 Android应用层的开发有几大模块,其中WebView是最重要的模块之一.网上能够搜索到的WebView资料可谓寥寥,Gith ...

  9. android WebView详细使用方法(转)

    1.最全面的Android Webview详解 2.最全面总结 Android WebView与 JS 的交互方式 3.你不知道的 Android WebView 使用漏洞 如果想保证登录状态,就插入 ...

随机推荐

  1. Halcon一日一练:创建三通道图像

    首先理解一个什么是三通道图像: 三通道图像就是彩色图像,我们之前黑白相机或黑白电视机都是彩用的灰阶图像,即单通道图像,一般是2的8次方个灰阶,即256个灰阶.彩色图像采用RGB,红绿蓝三个通道来合成彩 ...

  2. __call PHP伪重载方法

    为了避免当调用的方法不存在时产生错误,可以使用 __call() 方法来避免.该方法在调用的方法不存在时会自动调用,程序仍会继续执行下去 该方法有两个参数,第一个参数 $function_name 会 ...

  3. ATS缓存数据结构

    ATS缓存数据结构 HttpTunnel类 数据传输驱动器(data transfer driver),包含一个生产者(producer)集合,每个生产者连接到一个或是多个消费者(comsumer). ...

  4. Sql Server的艺术(四) SQL多表查询

    表的基本连接 SQL的一个重要特性就是能通过JOIN关键词,从多个交叉表中查询.分析数据. 连接表的目的 在关系数据库中,数据表设计的一个重要原则就是要避免冗余性. 减少了冗余信息,节省了数据库存储空 ...

  5. MySQL数据库中实现对中文字段按照首字字母排序

    转载自网络! 1. 在MySQL中,我们经常会对一个字段进行排序查询,但进行中文排序和查找的时候,对汉字的排序和查找结果往往都是错误的. 这种情况在MySQL的很多版本中都存在. 如果这个问题不解决, ...

  6. Cookie简述

    1. Cookie是什么? Cookie(Cookies,浏览器缓存), 是指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密). 2. Cookie的作用: ...

  7. 【深度学习】L1正则化和L2正则化

    在机器学习中,我们非常关心模型的预测能力,即模型在新数据上的表现,而不希望过拟合现象的的发生,我们通常使用正则化(regularization)技术来防止过拟合情况.正则化是机器学习中通过显式的控制模 ...

  8. vue环境搭建与创建第一个vuejs文件

    我们在前端学习中,学会了HTML.CSS.JS之后一般会选择学习一些框架,比如Jquery.AngularJs等.这个系列的博文是针对于学习Vue.js的同学展开的. 1.如何简单地使用Vue.js ...

  9. 用Markdown写微信公众号文章

    目前微信公众号的编辑器是不支持Markdown语法的,那怎么办呢? 有一款叫Markdown Here的插件可以解决这个问题(支持Chrome.Firefox.Safari). 官方网站:http:/ ...

  10. 介绍一个轻量级iOS安全框架:SSKeyChain

    SSKeyChains对苹果安全框架API进行了简单封装,支持对存储在钥匙串中密码.账户进行访问,包括读取.删除和设置.SSKeyChain的作者是大名鼎鼎的SSToolkit的作者samsoffes ...