vue项目内嵌其他系统页面登录失败

发生场景

有一个新项目,做一个综合平台,前后端分离项目。平台中将会内嵌其他项目的页面,进行单点登录后访问。
一开始是使用火狐浏览器进行开发,一切无恙。但是后来使用谷歌进行测试的时候,发现内嵌页面无法正常登录

发现问题

打开浏览器控制台,发现sso也成功了,重定向页面也成功了,但是重定向后,接着的请求却是登录请求。

解决思路

在火狐上可以,但是谷歌却不可以,那么可以判断出,是浏览器差异导致的。
百度一下,发现谷歌在cookie存储方面更为严格,且咱们登录确实也是和cookie相关联的,以这个思路排查下去,可以确定,是因为谷歌浏览器的cookie存储策略所导致的,禁止不同路径的系统请求cookie,所以外部系统获取或写入cookie被禁止,导致外部系统登录失败。

Google 在2020年2月4号发布的 Chrome 80 版本(schedule:https://www.chromestatus/features/schedule)中默认屏蔽所有第三方 Cookie,
即默认为所有 Cookie 加上 SameSite=Lax 属性(https://www.chromestatus/feature/5088147346030592),
并且拒绝非Secure的Cookie设为 SameSite=None(https://www.chromestatus/feature/5633521622188032), 
SameSite的作用就是防止跨域传送cookie,从而防止 CSRF 攻击和用户追踪,此举是为了从源头屏蔽 CSRF 漏洞。

解决方法

将外部系统用nginx代理成和平台相同的路径即可,这是最简单的方法~

### Vue2 中通过 iframe 嵌套外部项目时出现 404 错误的原因分析与解决方案 在 Vue2 项目中,当尝试通过 `<iframe>` 嵌套加载外部项目页面时,可能会遇到 404 错误。这种错误通常是由以下几个原因引起的: #### 1. **服务器端未正确处理路径** 如果服务器未正确配置静态资源的路径映射,则可能导致请求的资源无法找到。Vue Router 默认采用 `history` 模式,在此模式下,URL 不会带有 `#` 符号[^1]。然而,某些服务器可能不支持该模式下的路径重定向。 ##### 解决方法 可以通过修改 Web 服务器配置来解决这个问题。以下是常见的 Nginx 配置示例: ```nginx server { listen 80; server_name localhost; location / { try_files $uri /index.html; # 将所有未知路径重定向到 index.html } error_page 500 502 503 504 /50x.html; } ``` 对于 Apache 服务器,可以使用 `.htaccess` 文件进行类似的设置: ```apache <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.html [L] </IfModule> ``` #### 2. **Vue Router 的模式问题** 默认情况下,Vue Router 使用的是 `hash` 模式(即 URL 中带有一个 `#`)。但如果切换到了 `history` 模式而没有正确配置服务器,则会出现 404 错误。这是因为 `history` 模式的 URL 是纯路径形式,服务器需要知道如何将这些路径重新指向应用入口文件 `index.html`。 ##### 解决方法 可以在 Vue 路由初始化时显式指定为 `hash` 模式,从而避免依赖服务器配置: ```javascript import Vue from 'vue'; import Router from 'vue-router'; Vue.use(Router); const router = new Router({ mode: 'hash', // 设置为 hash 模式 routes: [ { path: '/', component: Home }, { path: '/about', component: About } ] }); export default router; ``` #### 3. **CORS (跨域资源共享) 限制** 如果嵌套的外部项目位于不同的域名下,浏览器的安全策略(同源策略)可能会阻止加载内容,进而引发 404 或其他网络错误。 ##### 解决方法 确保目标站点允许来自当前项目的 CORS 请求。这通常需要目标站点管理员调整其响应头,例如添加如下字段: ```http Access-Control-Allow-Origin: * ``` 或者更安全的方式是指定特定的来源地址: ```http Access-Control-Allow-Origin: https://your-domain.com ``` #### 4. **iframe 加载失败的具体排查** 有时即使解决了上述问题,仍然可能出现加载失败的情况。此时建议检查以下几点: - 确认目标链接是否有效。 - 查看开发者工具中的 Network 面板,确认是否有额外的 HTTP 错误码返回。 - 如果目标站点启用了 HTTPS,那么父页面也应同样启用 HTTPS 来避免混合内容警告。 --- ### 示例代码 假设我们希望在一个 Vue2 应用程序中嵌入一个外部网站,并且已经遇到了 404 错误。下面是一个简单的实现方式以及注意事项: ```html <template> <div id="app"> <h1>嵌套外部项目</h1> <iframe :src="externalUrl" width="100%" height="600px"></iframe> </div> </template> <script> export default { data() { return { externalUrl: 'https://example.com' // 替换为目标站点的实际 URL }; } }; </script> ``` 注意:如果目标站点不允许被嵌套,可能会触发 X-Frame-Options 安全机制,导致 iframe 显示空白页或报错。 --- ### 总结 针对 Vue2 项目中通过 iframe 嵌套外部项目时出现的 404 错误,可以从服务器配置、路由模式选择、CORS 政策等方面逐一排查并解决问题。优先推荐使用 `hash` 模式以减少对服务器配置的依赖;同时需确保目标站点已开放必要的权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值