背景:
当我在真实设备上测试 Android API 21 及以上版本的 Webview
时,我遇到了非常困惑的行为。
我的本地应用(在 assets 文件夹内)具有以下功能:
- 登录(2 步验证)。
- 根据验证情况显示项目列表。
问题:
在完成登录请求后,服务器返回一个包含会话信息的 cookie。但当使用 Android 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
在 API 21 或更高版本的设备上不会存储 cookie。在其余设备和所有模拟器中,相同的请求/响应工作正常。
澄清:
This flags are enabled inside the app:
android.webkit.CookieManager.setAcceptFileSchemeCookies(true);
在实例化CookieManager或webview之前,正如文档所说:
if(VERSION.SDK_INT >= 21) {
CookieManager.getInstance().setAcceptThirdPartyCookies(this.nativeWebView, true);
}
如果我在身份验证后访问cookie数据存储并检查“hasCookies”方法,我会得到
false
。两步骤认证服务实际上从同一端点调用了3个不同的路径。生成此服务响应的任何cookie都没有被存储。我不知道这是否相关。
当进行简单身份验证(连接不同服务器)时,在所有设备仿真器中都正确存储cookie。
我正在使用Angular 1.5
我知道该服务正在使用
http
而不是https
。这将在未来得到解决。控制台中没有错误消息。
问题:
Webview中是否有阻止存储cookie的内部安全措施?为什么它在模拟器上工作(这些是rooted设备),但在真实设备上无法工作?这真的很烦人。