document.cookie中expires 格式设置问题导致部分iphone safari上登录失效

一、问题描述

设备信息:iPhone 12, iOS 16.3
昨天有个小伙伴发现自己的iPhone safari打开网页登录时,登录页面显示登录成功,但实际进入首页后仍然显示未登录。多次测试,该问题在该设备上属于必现问题。

二、问题排查与解决

经过排查发现:
并非所有iphone上都会出现该问题,比如:iPhone 7, iOS 15.3上就能正常登录显示。

通过代码走查,系统在登录页面登录成功后会将Token信息存储在cookie中,并在跳转首页时通过cookie中携带的token获取用户信息,只要存在用户信息则页面显示已登录状态。

那么,问题可能就出在cookie的设置上。

接下来,使用MacBook与问题机型进行联调,联调方法大致如下:

(1)在MacBook中打开safari,在safari浏览器->设置…->高级中勾选在菜单栏中显示“开发”菜单
(2)iPhone中打开设置,点击Safari浏览器->高级,打开网页检查器开关
(3)用数据线链接MacBook与iPhone,在MacBook 的 Safari顶部开发菜单中选择xxx的MacBook, 找到对应的网页打开调试即可。

以下是联调问题机型,查看最终设置的cookie的结果:

在这里插入图片描述

在这里插入图片描述

通过上述两张图可以发现,实际doment.cookie的设置代码与最终效果存在差异,主要体现在Pathexpires 两个属性值上。正确的设置效果应该类似下面的样子:

在这里插入图片描述

那么问题出在哪呢?Path作为字符串,格式设置上应该不会有什么问题,而expires 就不同了,它是有一定的格式要求的:

The cookie expiration date defines the time when the browser will automatically delete it (according to the browser’s time zone).The date must be exactly in this format, in the GMT timezone. We can use date.toUTCString to get it. For instance, we can set the cookie to expire in 1 day:
// +1 day from now
let date = new Date(Date.now() + 86400e3);
date = date.toUTCString();
document.cookie = “user=John; expires=” + date;

对比代码,发现源代码少了toUTCString的调用。为了验证这个猜测,在登录页面联调时在Safari控制台直接运行测试代码:

在这里插入图片描述

运行后,进入首页正常显示登录状态,而此时的cookie审查也已正常设置:

在这里插入图片描述

至此,我们发现在iphone上如果document.cookie中expires 格式设置不正确会导致登录失效(当然,在比较早的机型上可能是正常的)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/699227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C/C++内存管理学习【new】

文章目录 一、C/C内存分布二、C语言中动态内存管理方式:malloc/calloc/realloc/free三、C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型四、operator new与operator delete函数五、new和delete的实现原理5.1 内置类型 六、定位new表达式(pl…

后端经典面试题合集

目录 1. Java基础1-1. JDK 和 JRE 和 JVM 分别是什么,有什么区别?1-2. 什么是字节码?采用字节码的最大好处是什么? 1. Java基础 1-1. JDK 和 JRE 和 JVM 分别是什么,有什么区别? JDK 是Java开发工具包&am…

基于ssm框架的高校班级管理系统设计与实现

为解决当前高校班级管理中管理方式落后、手段落后及效率低下等问题而以当前主流的互联网技术设计一款高校班级管理系统。该系统采用B/S模式的设计思路而将前端(JSP技术)和后端(SSM框架MySQL数据库)整合于一体并通过Java语言代码编…

VSCODE使用Django 页面和渲染

https://code.visualstudio.com/docs/python/tutorial-django#_use-a-template-to-render-a-page 通过模板渲染页面 文件 实现步骤 1, 修改代码,hello的App名字增加到installed_apps表中。 2, hello子目录下,创建 .\templates\…

常见的序列化数据结构方法及其优缺点汇总

文章目录 1. JSON (JavaScript Object Notation)2. XML (eXtensible Markup Language)3. YAML (YAML Aint Markup Language)4. Protobuf (Protocol Buffers)5. MessagePack6. BSON (Binary JSON)7. Avro8. Thrift9. CBOR (Concise Binary Object Representation) 将常见的序列化…

配置DM-Multipath多路径存储

1、申请并挂载共享存储 2、安装multipadthd服务 [root@localhost ~]# yum install -y multipadthd [root@localhost ~]# systemctl enable multipadthd [root@localhost ~]# yum list |grep multipadthd [root@localhost ~]# systemctl list-unit-files -t service |grep mul…

vue中使用echarts绘制双Y轴图表时,刻度没有对齐的两种解决方法

文章目录 1、原因2、思路3、解决方法3.1、使用alignTicks解决3.2、结合min和max属性去配置interval属性1、首先固定两边的分隔的段数。2、结合min和max属性去配置interval。 1、原因 刻度在显示时,分割段数不一样,导致左右的刻度线不一致,不…

全栈开发(TS,React,Vue, Java, 移动端flutter)接单

个人主页 https://hz.minicv.net/ 技术栈 前端:NextJS React VueJS 后端:NestJS Java 移动端:Flutter 其他:SpringCloud Redis Kafka Zookeeper 项目案例 微行简历( TS 全栈项目,一个极简的简历管理平…

【PHP设计模式03】抽象工厂模式

【抽象工厂模式】 前面讲的工厂方法模式,每增加一个产品都需要增加对应的工厂,这样就会存在很多工厂,但是在现实生活中的有些时候,人们并不关心产品是由哪个工厂制造的,就像一个服装厂既可以生产男装,也可以生产女装,我们只需造一个服装厂同时生产一个产品族下的男装和女…

【网络编程】从Retrofit原理来看HTTP

文章目录 create()validateServiceInterface()动态代理loadServiceMethod(method) create() 让我们先深入到create 里&#xff0c; public <T> T create(final Class<T> service) {validateServiceInterface(service);.... }validateServiceInterface() 我们发现…

【Java】Java基础(实验一)

目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 掌握Java程序的编辑、调试与运行&#xff1b;了解Java引用类型&#xff0c;掌握数组的定义和引用。掌握Java基本数据类型和输入输出。掌握Java程序结构 二、实验内容 1.JDK的环境变量设置及测试。 &#xff08…

HarmonyOS Stage模型 应用配置文件讲解

好&#xff0c;上文 HarmonyOS Stage模型基本概念讲解 中&#xff0c;我们简单讲解了HarmonyOS 中 Stage模型的基本概念 那么 我们继续学习Stage模型的相关知识 上文之后 我们肯定对它的概念和基本结构 有了一个了解 那么 我们就来看一下 基于Stage模型 它里面一些基本的配置文…

InnoDB基础篇(4)-数据类型在InnoDB中的选择

在MySQL数据库中&#xff0c;数据类型在InnoDB存储引擎中的选择是非常重要的。选择合适的数据类型可以在存储空间、性能和数据完整性方面取得优化。在本篇博客中&#xff0c;我们将介绍一些常见的MySQL数据类型&#xff0c;并讨论它们在InnoDB中的选择。 整数类型&#xff08;I…

15-36V降压充电光伏MPPT充电方案

1.MPPT原理--简介 MPPT&#xff0c;全称为Maximum Power Point Tracking&#xff0c;即最大功点跟踪&#xff0c;它是一种通过调节电气模块的工作状态&#xff0c;使光伏板能够输出更多电能的电气系统能够将太阳能电池板发出的直流电有效地贮存在蓄电池中&#xff0c;可有效地…

C++内联函数的使用

C是一门强大而灵活的编程语言&#xff0c;提供了许多特性来优化代码性能。其中之一就是内联函数&#xff0c;它可以在编译时将函数调用的地方直接替换为函数体&#xff0c;从而减少函数调用的开销。在本文中&#xff0c;我们将深入探讨C内联函数的使用&#xff0c;重点介绍它的…

uniapp editor组件添加插入超链接

标题uniapp editor组件添加插入超链接 我基于官方editor组件开发了一个可添加超链接等其他功能的富文本插件 官方富文本编辑器editor组件改良扩展优化版

视频推拉流EasyDSS视频直播点播平台授权出现激活码无效并报错400是什么原因?

视频推拉流EasyDSS视频直播点播平台集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体&#xff0c;可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务&#xff0c;在应用场景上&#xff0c;平台可以运用在互联网教育、在线课堂、游戏…

32.云原生Istio流量管理之官网Bookinfo应用实战演示

云原生专栏大纲 文章目录 流量管理基于版本的路由配置基于 Http header 的路由配置故障注入延迟故障注入异常故障注入故障注入测试 比例分配流量请求超时熔断什么是熔断创建 httpbin 服务创建访问者服务 流量管理 Istio 是服务治理的工具&#xff0c;Istio 的流量管理能力&am…

Django学习笔记-forms使用

1.创建forms.py文件,导入包 from django import forms from django.forms import fields from django.forms import widgets2. 创建EmployeeForm,继承forms.Form 3.创建testform.html文件 4.urls.py添加路由 5.views中导入forms 创建testform,编写代码 1).如果请求方式为GET,…

unity学习(38)——创建(create)角色脚本(panel)--EventSystem

1.在scripts文件夹下创建一个脚本CreatePlayerPanel.cs&#xff0c;脚本挂到panel上&#xff01;给panel加个tag&#xff0c;叫createPanel&#xff0c;脚本内容如下&#xff1a; using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngin…