热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【WebView的cookie机制】轻松搞定WebViewcookie同步问题

在进行APP+H5混合开发的时候,一些功能是用native方法实现的,如登陆,一些功能是用H5实现的。所以往往需要将在native方法登陆的状态同步到H5中避免再次登陆。这种情况在Android开

在进行APP+H5混合开发的时候,一些功能是用native方法实现的,如登陆,一些功能是用H5实现的。所以往往需要将在native方法登陆的状态同步到H5中避免再次登陆。这种情况在Android开发中比较常见,因为Android不会自动同步COOKIE到WebView。做iOS开发则不用担心这个问题,因为iOS内部已经实现了COOKIE同步。本文将会介绍两种COOKIE同步的方式,并重点分析WebView的COOKIE机制。在开始之前先讲一下基于session的登录验证。
基于session的登录验证:
基于session的登录验证,会在程序请求接口的时候判断服务器端是否有当前会话的session,如果没有则被认为没有登录。客户端没有session这一概念,但有COOKIE与其对应。每一个session都有一个session id作为唯一标识。在登录成功后服务器会在请求头中返回COOKIE,COOKIE包含着这次登录会话的session id,在接下来的请求中只需要将登陆返回的COOKIE设置到请求头中便可以通过验证。

方式一:客户端将COOKIE传给H5

如何做:

  • 客户端:将登陆时从服务器取得的COOKIE传给html。
  • html:ajax从参数中取出客户端传来的COOKIE,ajax发请求时将客户端传来COOKIE设置到请求头中。

ajax修改COOKIE的方式

$.ajax({
headers: {'COOKIE' : document.COOKIE },
url: "sub.domain.com",
success: function(){}
})

缺点:

  1. 兼容性差,多数浏览器为了安全起见,都做了禁止修改请求中的COOKIE的限制。比如iOS的WebView会拦截ajax修改的COOKIE。
  2. 繁琐,每次请求都需要拼接COOKIE作为参数,比较繁琐。

方式二:将COOKIE同步到WebView(推荐)

原理分析:

WebView的COOKIE机制

WebView是基于webkit内核的UI控件,相当于一个浏览器客户端。它会在本地维护每次会话的COOKIE(保存在data/data/package_name/app_WebView/COOKIEs.db)。
如图:
查看APP COOKIE
当WebView加载URL的时候,WebView会从本地读取该URL对应的COOKIE,并携带该COOKIE与服务器进行通信。
WebView通过android.webkit.COOKIEManager类来维护COOKIE。COOKIEManager是WebView的COOKIE管理类。

如何做:

下面我们就通过COOKIEManager将COOKIE同步到WebView中。
之前同步COOKIE需要用到COOKIESyncManager类,现在这个类已经被deprecated。如今WebView已经可以在需要的时候自动同步COOKIE了,所以不再需要创建COOKIESyncManager类的对象来进行强制性的同步COOKIE了。现在只需要获得 COOKIEManager的对象将COOKIE设置进去就可以了。

第一步:登录时从服务器的返回头中取出COOKIE
根据Http请求的客户端不同,取COOKIE的方式也不同,我就不一一罗列了,需要的网友可以自行Google,以HttpURLcollection为例:
String COOKIEStr = conn.getHeaderField("Set-COOKIE");
第二步:将COOKIE同步到WebView中

/**
* 将COOKIE同步到WebView
* @param url WebView要加载的url
* @param COOKIE 要同步的COOKIE
* @return true 同步COOKIE成功,false同步COOKIE失败
* @Author JPH
*/

public static boolean syncCOOKIE(String url,String COOKIE) {
if (Build.VERSION.SDK_INT COOKIESyncManager.createInstance(context);
}
COOKIEManager COOKIEManager = COOKIEManager.getInstance();
COOKIEManager.setCOOKIE(url, COOKIE);//如果没有特殊需求,这里只需要将session id以"key=value"形式作为COOKIE即可
String newCOOKIE = COOKIEManager.getCOOKIE(url);
return TextUtils.isEmpty(newCOOKIE)?false:true;
}

如图:
同步COOKIE

如果设置成功,通过COOKIEManager.getCOOKIE(url)方法就可取得刚才设置的COOKIE,如果两次设置COOKIE的url相同,则COOKIEManager会将上一次设置的COOKIE覆盖,已达到更新的效果。
下面我们查看一下COOKIE数据库中发生的变化。
如图:
查看WebView COOKIE
提示:
1. 同步COOKIE要在WebView加载url之前,否则WebView无法获得相应的COOKIE,也就无法通过验证。
2. 每次登录成功后都需要调用”syncCOOKIE”方法将COOKIE同步到WebView中,同时也达到了更新WebView的COOKIE。如果登录后没有及时将COOKIE同步到WebView可能导致WebView拿的是旧的session id和服务器进行通信。

优点:

  1. 方便,只需要在登陆后将COOKIE同步到WebView即可,省去了每次请求都需要设置一次的繁琐。
  2. 兼容性好,因为是系统原生支持的,所以兼容性自然比方式一要好,不存在COOKIE被拦截的问题。

推荐阅读
  • 前言:关于跨域CORS1.没有跨域时,ajax默认是带cookie的2.跨域时,两种解决方案:1)服务器端在filter中配置详情:http:blog.csdn.netwzl002 ... [详细]
  • 一.常见基于身份识别进行反爬1通过headers字段来反爬headers中有很多字段,这些字段都有可能会被对方服务器拿过来进行判断是否为爬虫1.1通过headers中的User-A ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • Question该提问来源于开源项目:react-native-device-info/react-native-device-info ... [详细]
  • 目前正在做毕业设计,一个关于校园服务的app,我会抽取已完成的相关代码写到文章里。一是为了造福这个曾经帮助过我的社区,二是写文章的同时更能巩固相关知识的记忆。一、前言在爬取教务系统 ... [详细]
author-avatar
Nedo_zou
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有