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

[Android]Webview利用CookieSyncManager获取或设置Cookies的策略

应用场景或许,你也有碰到过这样的应用场景:APP应用的某些功能,需要调用内嵌的WebView去加载某个URL使用.但用户在手机APP已经成功登录过了.这时,如果在内置浏览器去打开网页还需要

应用场景

或许, 你也有碰到过这样的应用场景:

APP应用的某些功能, 需要调用内嵌的WebView去加载某个URL使用.  但用户在手机APP已经成功登录过了. 这时, 如果在内置浏览器去打开网页还需要用户再输入登录一次, 似乎显得不够人性化.  又或者, 用户在内置浏览器(WebView) 访问过一些页面, 想把这些有用的 COOKIEs 信息保存在本地.  因此, 我们会想, 要是能管理APP上浏览器(WebView) 在该站点URL的 COOKIEs, 使后台识别为已登录, 蛮不错的~   这里我们使用 COOKIESyncManager 来实现.


小谈COOKIESyncManager 

翻看这类 - COOKIESyncManager, 机智的你一定发现官方已经给它打上一个可爱的 @Deprecated .  为啥子呢? 

 *
* @deprecated The WebView now automatically syncs COOKIEs as necessary.
* You no longer need to create or use the COOKIESyncManager.
* To manually force a sync you can use the COOKIEManager
* method {@link COOKIEManager#flush} which is a synchronous
* replacement for {@link #sync}.
*/

这是该类的介绍. 原来现在的 WebView 已经具备自动同步COOKIEs 的功能, 所以不再需要人为去创建或使用 COOKIESyncManager.  简单地说, 就是新的WebView已经足够强大, 可以自己去管理访问站点的COOKIEs. 当然, 针对某些特殊情况, 依旧提供了人工强制的同步COOKIEs 的方法:

if (Build.VERSION.SDK_INT <21) {
COOKIESyncManager.getInstance().sync();
} else {
COOKIEManager.getInstance().flush();
}

比如上面说的应用场景,  假设目标站点URL为 http://testCOOKIE.mobile.xxx.com/, 浏览器(WebView) 先前没有访问过这个站点, 就不存在这个站点的COOKIEs, 但是你又想第一次访问就携带一些用户信息, 比如将用户的userId, groupId,之类的信息放进去, 方便服务器进行认证和权限管理. 甚至免去二次登录的麻烦. 这时, 就需要我们人工设置WebView 的COOKIEs. 所以说, COOKIESyncManager 虽然已经被Deprecated 掉, 还是有一定用处的.


COOKIESyncManager 类的代码非常少, 我们只关心几个关键的方法就足够用了.


使用COOKIESyncManager 前, 要先去创建:

COOKIESyncManager.createInstance(context);


开始同步:

COOKIESyncManager.getInstance().startSync();


停止同步, 官方建议在Activity.onResume() 中调用:

COOKIESyncManager.getInstance().stopSync();

因为自动同步的时间间隔是5分钟, 这个时间间隔也许显得过长, 并不能保证及时的保存有效有用的COOKIEs. 所以我们就可以人为去同步保存它:

if (Build.VERSION.SDK_INT <21) {
COOKIESyncManager.getInstance().sync();
} else {
COOKIEManager.getInstance().flush();
}
什么时候去调用呢?  可以在浏览器的关键周期方法调用, 比如WebViewClient 的 onPageFinished(). 同时在Activity 的 onPause() 周期方法等等. 这样, 就能有效的保证COOKIEs能及时被同步保存.


移除Session COOKIE:

removeSessionCOOKIE();
比如用户已经登录, 调用该方法后, 再次访问该站点, 就会变成未登录的状态.

COOKIESyncManager 对COOKIEs 的管理策略究竟是怎样的? 

大家知道, COOKIEs 都有有效期, 过了有效期自然无效. COOKIESyncManager 会开一个单独的定时器线程去保存(间隔为5mins) COOKIEs. 线程会在设备的RAM 和 本地永久化存储

之间去维护这些COOKIEs. 举个例子, 当人为的调用 COOKIESyncManager.getInstance().sync() 同步了COOKIEs. 然后退出账号的登录, 重启APP应用, 甚至重启手机设备, 再次打开应用进入到对应的WebView, 会奇怪的发现, 居然还是已登录状态... 顿时风中凌乱... 因此, 比如应用里退出账号后, 应当及时将浏览器的session对话移除掉.


OK. 来到这里, 我们已经对COOKIESyncManager 有一定了解囖. 下面的代码, 看起来就So easy了~


实现过程

首先, 假设目标站点URL为 http://testCOOKIE.mobile.xxx.com/ . 我们来实现上面说的应用场景: 用户在应用已经登录了, 希望打开目标站点时就已经是登录状态, 而不再需要在网页二次登录. 应用内登录后的用户有一串识别用的COOKIEs (下面模拟数据, 但是实际中我使用真实数据和站点做测试的 == ) :

UID=EBFDA984906B62C444931EA0
SID=EBFDA984906BEE91F90362C444931EA0
PSTM=14572770
TTDSS=Hl3NVU0N3ltZm9OWHhubHVQZW1BRThLdGhLaFc5TnVtQWd1S2g1REcwNVhTS3RXQVFBQ


要将这一串 COOKIEs 要添加到 WebView ,  然后 LoadUrl(), 就算成功. 

COOKIESyncManager.createInstance(this);
COOKIEManager COOKIEManager = COOKIEManager.getInstance();
COOKIEManager.setAcceptCOOKIE(true);
String url = "http://testCOOKIE.mobile.xxx.com/";
COOKIEManager.setCOOKIE(url, "UID=EBFDA984906B62C444931EA0");
COOKIEManager.setCOOKIE(url, "SID=EBFDA984906BEE91F90362C444931EA0");
COOKIEManager.setCOOKIE(url, "PSTM=14572770");
COOKIEManager.setCOOKIE(url, "TTDSS=Hl3NVU0N3ltZm9OWHhubHVQZW1BRThLdGhLaFc5TnVtQWd1S2g1REcwNVhTS3RXQVFBQ");
if (Build.VERSION.SDK_INT <21) {
COOKIESyncManager.getInstance().sync();
} else {
COOKIEManager.getInstance().flush();
}
这里有个小坑... 设置COOKIE 的值, 每一对 key-value 需要分开设置, 不能这样写:

COOKIEManager.setCOOKIE(url, "SID=EBFDA984906BEE91F90362C444931EA0;PSTM=14572770;TTDSS=Hl3NVU0N3ltZm9OWHhubHVQZW1BRThLdGhLaFc5TnVtQWd1S2g1REcwNVhTS3RXQVFBQ;");

这时, 再去访问站点:

mWebView.loadUrl("http://testCOOKIE.mobile.xxx.com/");
就发现, 站点已经显示为登录状态. 也许你会说, 搞毛, 根本没成功好吧!!!   是这样的兄弟, 这个... 还需要后台的配合. 就是说, 你设置COOKIEs后去访问该站点, 网站开发的人应当对你的 COOKIEs 信息做处理, 比如根据不同的UID, token什么, 赋予不同的用户权限, 判断登录和未登录状态等等.

设置 COOKIEs 的操作已经成功. 需要移除时, 直接这样:

COOKIESyncManager.createInstance(context);
COOKIEManager COOKIEManager = COOKIEManager.getInstance();
COOKIEManager.removeSessionCOOKIE();

if (Build.VERSION.SDK_INT <21) {
COOKIESyncManager.getInstance().sync();
} else {
COOKIEManager.getInstance().flush();
}

关于获取站点 COOKIEs 的方法, 既然有 setCOOKIE, 应当也有 getCOOKIE 吧. 去看看, 果然有耶:

COOKIEManager.getCOOKIE(url);

以上就是文章的内容, 希望能给予你一点帮助. ^^



推荐阅读
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 深入浅出解析HTTP协议的核心功能与应用
    前言——协议是指预先设定的通信规则,确保双方能够按照既定标准进行有效沟通,从而实现准确的信息交换。例如,驯兽师通过拍手使动物坐下,这实际上是一种预设的协议。本文将详细探讨HTTP协议的核心功能及其广泛应用,解析其在现代网络通信中的重要作用。 ... [详细]
  • 在使用Eclipse进行调试时,如果遇到未解析的断点(unresolved breakpoint)并显示“未加载符号表,请使用‘file’命令加载目标文件以进行调试”的错误提示,这通常是因为调试器未能正确加载符号表。解决此问题的方法是通过GDB的`file`命令手动加载目标文件,以便调试器能够识别和解析断点。具体操作为在GDB命令行中输入 `(gdb) file `。这一步骤确保了调试环境能够正确访问和解析程序中的符号信息,从而实现有效的调试。 ... [详细]
  • 本文详细解析了Autofac在高级应用场景中的具体实现,特别是如何通过注册泛型接口的类来优化依赖注入。示例代码展示了如何使用 `builder.RegisterAssemblyTypes` 方法,结合 `typeof(IEventHandler).Assembly` 和 `Where` 过滤条件,动态注册所有符合条件的类,从而简化配置并提高代码的可维护性。此外,文章还探讨了这一方法在复杂系统中的实际应用及其优势。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 在 CentOS 7 系统中安装 Scrapy 时遇到了一些挑战。尽管 Scrapy 在 Ubuntu 上安装简便,但在 CentOS 7 上需要额外的配置和步骤。本文总结了常见问题及其解决方案,帮助用户顺利安装并使用 Scrapy 进行网络爬虫开发。 ... [详细]
  • 本指南介绍了 `requests` 库的基本使用方法,详细解释了其七个主要函数。其中,`requests.request()` 是构建请求的基础方法,支持其他高级功能的实现。此外,我们还重点介绍了如何使用 `requests.get()` 方法来获取 HTML 网页内容,这是进行网页数据抓取和解析的重要步骤。通过这些基础方法,读者可以轻松上手并掌握网页数据抓取的核心技巧。 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • 深入解析HTTP网络请求API:从基础到进阶的全面指南
    本文全面解析了HTTP网络请求API,从基础到进阶,详细介绍了Android平台上的两种原生API——HttpUrlConnection和HttpClient。这两种API通过对底层Socket的封装,提供了高效、灵活的网络通信功能。文章不仅涵盖了基本的使用方法,还深入探讨了性能优化、错误处理和安全性等方面的高级主题,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • 本文深入探讨了ASP.NET中ViewState、Cookie和Session三种状态管理技术的区别与应用场景。ViewState主要用于保存页面控件的状态信息,确保在多次往返服务器过程中数据的一致性;Cookie则存储在客户端,适用于保存少量用户偏好设置等非敏感信息;而Session则在服务器端存储数据,适合处理需要跨页面保持的数据。文章详细分析了这三种技术的工作原理及其优缺点,并提供了实际应用中的最佳实践建议。 ... [详细]
  • HTML5 Web存储技术是许多开发者青睐本地应用程序的重要原因之一,因为它能够实现在客户端本地存储数据。HTML5通过引入Web Storage API,使得Web应用程序能够在浏览器中高效地存储数据,从而提升了应用的性能和用户体验。相较于传统的Cookie机制,Web Storage不仅提供了更大的存储容量,还简化了数据管理和访问的方式。本文将从基础概念、关键技术到实际应用,全面解析HTML5 Web存储技术,帮助读者深入了解其工作原理和应用场景。 ... [详细]
author-avatar
木_妍_595
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有