安卓端Chrome/Firefox打开PWA时start_url请求无Cookie的行为疑问
核心背景:PWA启动请求的特殊上下文
安卓端Chrome和Firefox在启动PWA时,向start_url发起的初始请求属于浏览器的启动上下文请求,和普通页面刷新、手动导航的请求上下文完全不同——此时PWA的独立容器还未完成初始化,浏览器不会自动将当前站点的Cookie池关联到这个启动请求上,尤其是HttpOnly、SameSite属性的会话Cookie,大概率不会被携带。
这就导致你的认证系统因为拿不到Cookie,判定用户未登录,重定向到登录页;但刷新登录页时,PWA容器已经初始化完成,请求属于正常的站点内导航,浏览器会正常携带Cookie,所以系统又识别出用户已登录,再次重定向。
302与meta-refresh的差异原因
- 302重定向无效:302是服务器端发起的跳转,整个过程属于同一条请求链,始终处于初始的启动请求上下文里,浏览器依然不会主动携带Cookie,跳转后的页面自然还是拿不到认证信息。
- meta-refresh有效:meta-refresh是客户端页面发起的跳转,当浏览器加载完
start_url对应的页面(哪怕是登录页)后,PWA容器已经完成初始化,此时的跳转属于正常的站点内导航行为,浏览器会自动读取并携带当前站点的Cookie,因此能正确识别用户的登录状态,完成预期的重定向。
额外补充:如果你的Cookie设置了SameSite=Strict,启动请求的跨上下文特性会触发浏览器的严格Cookie策略,进一步加剧不携带Cookie的情况;而meta-refresh属于同站点内的客户端跳转,完全符合SameSite的规则,所以能顺利携带Cookie。
内容的提问来源于stack exchange,提问作者Derkades
相关产品推荐
相关产品推荐

