【问题标题】:Cookies are not stored in android Webview API 21 and upCookie 不存储在 android Webview API 21 及更高版本中
【发布时间】:2016-06-01 04:20:36
【问题描述】:

背景

在真实设备中测试时,我在 API 21 及更高版本中遇到了一个非常令人困惑的行为。

我有一个具有以下功能的本地 HTML5 应用程序(在 assets 文件夹内)

  • 登录(两步验证)。
  • 根据身份验证显示项目列表。

问题

在完成登录请求后,服务器会返回一个带有会话的 cookie。当使用 API 21 或更高版本的真实设备时,此 cookie 不会存储在 Webview 中。如果我使用模拟器(在这种情况下为 Genymotion),cookie 会被正确存储。

更多信息

进行身份验证的请求具有以下标头:

POST http://myServer/j_spring_security_check HTTP/1.1
Proxy-Connection: keep-alive
Content-Length: 101
access-control-allow-origin: *
accept: application/json
access-control-allow-credentials: true
User-Agent: Framework/1.5.0 (Linux; U; Android 6.0.1; Nexus 5X Build/MMB29Q) App/0.1.1
Origin: file://
content-type: application/x-www-form-urlencoded
Accept-Language: en-US
X-Requested-With: app.package
Host: myServer

回复如下:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=4D169E8656DBEDFFA4D17FE8D436A5BA; Expires=Fri, 19-Feb-2016 14:27:55 GMT; Path=/; HttpOnly
Content-Type: application/json;charset=UTF-8
Content-Length: 43
Date: Fri, 19 Feb 2016 14:17:55 GMT

cookie 不存储在 API 21 或更高版本的设备中。相同的请求/响应在其余设备 + 所有模拟器中都可以正常工作

澄清

  • 此标志在应用内启用:

    android.webkit.CookieManager.setAcceptFileSchemeCookies(true);
    

(在实例化 CookieManager 或 webview 之前,如 documentation 所说)

if(VERSION.SDK_INT >= 21) {

    CookieManager.getInstance().setAcceptThirdPartyCookies(this.nativeWebView, true);
}
  • 如果在进行身份验证后,我访问 cookie 数据存储并 检查“hasCookies”方法,我得到false

  • 两步验证服务实际上从相同的端点调用了 3 个不同的路径。没有存储生成此服务的响应的任何 cookie。我不知道这是否相关。

  • 进行简单身份验证(到不同的服务器)时,cookie 会正确存储在所有设备模拟器中。

  • 我使用的是 Angular 1.5

  • 我知道该服务正在使用http 而不是https。这将在未来得到解决。

  • 我在控制台中没有收到错误消息。

问题:

网络视图中是否有任何内部安全措施阻止 cookie 的存储?为什么它适用于模拟器(即有根设备)而不是真实设备?这真的让我很烦。

【问题讨论】:

    标签: android angularjs http cookies webview


    【解决方案1】:

    如果网络请求是使用 window.fetch 完成的,你可能需要添加:

    fetch('/something', { credentials: 'same-origin' }) // 或 'include'

    在 chromium 上,window.fetch 的凭据标志默认设置为“省略”,并且没有 cookie 存储到 cookie 存储中。有关此错误的更多详细信息:https://bugs.chromium.org/p/chromium/issues/detail?id=477523

    【讨论】:

    • 是的,这是一个重要数据:http 请求是使用 windows.fetch 完成的 ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2016-01-29
    • 1970-01-01
    相关资源
    最近更新 更多