背景:
新系统中开一个菜单,内嵌老系统的页面。 新老系统域名不同
技术方案:
前端在新系统的页面中通过iframe嵌入老系统的页面
具体实现流程: 新系统点击菜单,请求后端接口拿到一个凭证,通过iframe的src属性配置老系统中间页,并携带上目标跳转页和后端返回的code 后端拿到code后,会在cookie注入老系统的登录态SESSIONID,实现免登录。
核心代码
<iframe
:src="iframeurl"
sandbox="allow-scripts allow-same-origin allow-forms allow-popups allow-modals"
allow="payment"
frameborder="0"
orgin="*"
width="100%"
></iframe>
// oldSystemUrl.html 后端指定的跳转中间页 code 后端接口返回,targetUrl目标页面
iframeurl = `oldSystemUrl.html?code=${code}&requestUrl=${targetUrl}`
遇到的问题以及解决方案:
1、通过iframe嵌套的老系统页面无法登录,但是通过浏览器地址栏输入url访问能正常登录
观察发现虽然cookie有正常写入,但是通过iframe嵌套的页面,访问请求接口的过程中并未携带cookie;后经查资料发现,原因是没有显式设置cookie的samesite属性,导致被默认为Lax; 设置samesite属性值为NONE
2、谷歌浏览器无痕模式下Cookie无法写入
谷歌浏览器在设置中修改 # Cookie 及其他网站数据#允许所有Cookie
引用知识点
iframe
HTML内联框架元素,它能够将另一个 HTML 页面嵌入到当前页面中。
参考:developer.mozilla.org/zh-CN/docs/…
SameSite属性
SameSite 是 HTTP 响应头Set-Cookie的属性之一。它允许您声明该 Cookie 是否仅限于第一方或者同一站点上下文。
SameSite 接受下面三个值:
Lax: Cookies 允许与顶级导航一起发送,并将与第三方网站发起的 GET 请求一起发送。这是浏览器中的默认值。
Strict: Cookies 只会在第一方上下文中发送,不会与第三方网站发起的请求一起发送。
None: Cookie 将在所有上下文中发送,即允许跨站发送。
SameSite=None 需要 Secure;否则控制台会报警告
Set-Cookie: flavor=choco; SameSite=None; **Secure**
需要注意的是:
Secure cookie 仅通过 HTTPS 协议加密发送到服务器。请注意,不安全站点(http:)无法使用 Secure 指令设置 cookies。