Cookie未存储在Android Webview API 21及更高版本

时间:2016-02-19 14:42:12

标签: android angularjs http cookies webview

背景

我在API 21中遇到了非常令人困惑的行为Webview,而在在真实设备中进行测试时,我的行为非常混乱。

我有一个本地HTML5应用程序(内部资产文件夹),具有以下功能

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

问题

执行登录请求后,服务器返回带有会话的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

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

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

  • 我使用的是Angular 1.5

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

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

问题:

网页视图中是否存在阻止Cookie存储的内部安全措施?为什么它适用于仿真器(有根设备)而不是真实设备?这真让我烦恼。

1 个答案:

答案 0 :(得分:1)

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

  

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

在chrome上,window.fetch默认将凭据标志设置为'省略',并且cookie存储中不存储任何cookie。有关此错误的更多详细信息,请访问:https://bugs.chromium.org/p/chromium/issues/detail?id=477523