【发布时间】: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