双核浏览器切换内核(模式)的行为分析
测试的浏览器
360安全浏览器、qq浏览器、搜狗浏览器
约定
- 在没有特别指出某条性质属于具体哪一个浏览器时,表示对于所有测试的浏览器均适用。
- 极速模式指以Webkit为内核的模式,兼容模式指以IE为内核的模式。
结论
对 Cookie 的影响
切换内核时浏览器会自动复制所有的cookie,并且不受secure, httpOnly, path等属性影响,也就是说上述三个属性不论取何值,都会在两种模式(两种内核)中复制。
关于360安全浏览器中的__guid
和monitor_count
在使用360安全浏览器时,不论是在兼容模式还是极速模式,浏览器会自动为你访问的每一个网站增加两个cookie: __guid
和 monitor_count
。
据观察,它们的行为规律如下:
__guid
: 是一个类似于唯一主键的长字符串,在每次用户第一次访问某个域名时,浏览器会生成一个新的 ‘__guid’ ,在用户切换内核时,这个值会被自动复制,保持不变。monitor_count
: 是一个从1开始的自增数字,在极速模式下,每发一次请求,会自增1,每次切换内核(双向均可),也会自增1,但在兼容模式下,每发一次请求不会自增。
上述两个cookie猜测应该是360安全浏览器自身的某种机制,开发者不必太关心它们,修改、删除它们均不会影响cookie在内核之间的复制,开发者只需注意自己的cookie的key在取名的时候要避开它们就可以了。
对 Head 的影响
最重要的是对 User-Agent
的影响,三个浏览器均会在切换内核后改变 User-Agent
,因此如果你的后台程序依赖 User-Agent
,那么请注意这个特性。
其他 Head 也会有很大影响(但不会影响前端自己设定的 Head ),但通常对于后台开发者来说并不重要,因此不过多分析。
对 Storage 的影响
Session Storage
不论是从极速模式切换到兼容模式,还是反过来,Session Storage 都不会复制到另一个模式,也就是说两个模式之间不共享 Session Storage 中的数据。
对于360安全浏览器、qq浏览器,极速模式下,切换到兼容模式并再次切换回极速模式后,之前放入 Session Storage 中的对象依然存在,也就是说,切换内核并不会导致这些对象的丢失;而对于搜狗浏览器,并不存在这条特性,也就是说极速模式切换到兼容模式,会丢失之前保存的对象
兼容模式不会保存 Session Storage 中的对象,在切换内核时,之前保存到 Session Storage 中的对象会立刻丢失,再次切换回兼容模式也已经找不到了。
Local Storage
不论是从极速模式切换到兼容模式,还是反过来,Local Storage 都不会复制到另一个模式,也就是说两个模式之间不共享 Local Storage 中的数据。
兼容模式下,不同的浏览器之间会有限程度地共享 Local Storage 中的信息,表现为:在某个浏览器的兼容模式下放入(或修改、删除)的对象,在其他浏览器的兼容模式下(也包括IE浏览器本身),并不会立刻体现出来,但如果你重新打开这些浏览器,就会看到刚才的新增、修改、删除; 例如在360安全浏览器的兼容模式下,往 Local Storage 中新增一个对象,那么你重新打开IE浏览器之后,会发现在 IE 浏览器的 Local Storage 中也存在刚刚新增的对象。
qq浏览器的极速模式下,会往 Local Storage 自动存入三个key:
white
,date
,black
,因此你在存入对象时一定要注意避开这三个key。
建议
- 不要在 Storage 中存放敏感信息和重要信息,仅建议存放一下无关紧要的数据。
- Cookies 机制可以放心使用,不需要担心切换内核造成状态遗失。
- 对于浏览器自身发送的 Head ,如
User-Agent
,在切换内核时会改变,后台开发者不要将此类 Head 作为用户身份的校验依据。例如在 Apereo Cas 4.1.x 系列,后台会将 User-Agent 与登录令牌绑定起来,如果 User-Agent 改变,后台会认为这是一个新用户。
用于测试的demo
用于测试Storage的demo
https://github.com/rocketk/testmultikernel-storage
用于测试Cookies的demo
https://github.com/rocketk/testmultikernel-cookies