前置知识
当Iframe和外部父页面满足同源安全策略的时候,那么父页面是可以获取到Iframe内DOM的。 如果不满足同源策略的话,通过跨域安全策略(设置CORS来满足、document.domain)也同样可以获取。否则没有经过iframe方的同意是不允许获取内部dom的。
var iframe = document.getElementById('myIframe'); // 1.获取iframe的挂载的那个标签元素dom
var iframewindow = iframe.contentWindow // 2.通过挂载节点获取Ifrmae内部的window对象
var iframeDocument = iframewindow.docuemnt // 3.通过window对象然后再进一步获取到Iframe内部的文档对象
iframeDocument。getElementById('#id') // 4.最后才能通过Iframw的文档对象拿到文档内对应的DOM对象
注意: 获取Iframe内部dom必须要等到iframe加载完成才可以,如果只是获取到iframe的挂载节点,并不能也不知道iframe是否加载好了,因此需要给挂载点添加一个loade加载完成事件。参考: docs.pingcode.com/ask/258517.…
1.1 加载跨域页面问题
前提:如果iframe加载的页面涉及到跨域,是拿不到里面的dom的,所以如果是跨域的情况下需要通过CORS等设置满足跨域的安全限制要求。
1.2 样式问题
(1) Iframe高度自适应问题
(1)Iframe登录权限问题
登录权限问题存在两个问题,一个是用户之前在单独访问的时候已经登录过了,那么访问另一个网页(这个网页中存在iframe嵌入这个用户登录过的网站)时候,由于跨域问题还需要重复登录(因为跨域会导致iframe默认不能获取到浏览器内部之前种下的cookie),故请求的时候无法带上用户浏览器种的cookie。
cookie中的sameSite属性可以设置为三个值:strict(严格)、lax(松懈)、none(无要求),这三个值是用来管理跨站访问时候cookie的携带与否。
业务问题
我们需要在自己系统中通过iframe嵌入一个第三方的系统,那么存在几个可能问题:1.加载的时候浏览器是否会因为跨域拒绝iframe访问第三方因为()
问题1:如何解决重复登录问题
不同于重复登录,用户之前也没有独立访问过这个网址,那么希望在用户的浏览器没有这个iframe的情况下,可以一次都不用登录就能实现iframe访问。例如:打开这个页面就会自动跳转到登录页,原因是被嵌入系统没有登录(没有token)肯定不让访问内部页面的,本文就是解决这个问题的。
分为同域和不同域名
同域名:通过a.baidu.com和B.baidu.com共享一个cookie(通过设置domain为:baidu.com)来实现自动带上cookie。但是由于iframe的
安全限制,那么需要单独再设置一个same-site属性,这样可以保证Iframe允许自动带入。
不同域名:通过sso服务器不同域名的实现,先放开浏览器对iframe的限制(配置same-site),这样第二次请求b系统的时候会有两个重定向,先重定向到sso,此刻带上了sso的cookie(即token),然后sso给你将这个token拼接一个url查询参数,然后给你另一个重定向到b系统,b系统拿到这个访问自己的查询参数,然后直接去验证这个sso-token,认证成功就种上自己系统的cookie。
问题2:如何实现免登录
我们可以通过在Iframe中,通过js代码先和父页面配合(发出一个请求接口,拿到自己系统的token), 然后在Iframe中的src链接上,带上这个token给第三方的服务器(这个时候token可以认为通过js代码形式给url塞入了查询参数,然后给了第三方服务器的cookie)。通过手动js添加token形式弥补了cookie认证。
1.3 iframe和父页面各自存在window 浏览器打开一个HTML文档,就会创建一个对应的window对象,如果是Iframe的话也是同样创建自己的window,这样就解决了js隔离的问题,也保证了安全性,如果共享的话安全问题就大了。