VUE跨域、常用解决跨域的方法

当我们遇到请求后台接口遇到 Access-Control-Allow-Origin 时,那说明跨域了。

跨域是因为浏览器的同源策略所导致,同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,同源是指:域名、协议、端口相同

解决跨域常用方法:

一、VUE2.0中常用proxy来解决跨域问题

1、在vue.config.js中设置如下代码片段

module.exports = {
  dev: {
    // Paths
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',
    proxyTable: { // 配置跨域
    '/api':{
        target:`http://www.baidu.com`, //请求后台接口
        changeOrigin:true, // 允许跨域
        pathRewrite:{
            '^/api' : '' // 重写请求
        }
    }
  },
}

 2、创捷axioss实例时,将baseUrl设置为 ‘/api’

const http = axios.create({
  timeout: 1000 * 1000000,
  withCredentials: true,
  BASE_URL: '/api'
  headers: {
     'Content-Type': 'application/json; charset=utf-8'
   }
})

二、JSONP解决跨域

Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据。

<!DOCTYPE html>
       <html>
       <head>
           <meta charset="utf-8">
       </head>
       <body>
       <div id="textID"></div>
       <script type="text/javascript">
           function text_jsonp(req){
               // 创建script的标签
               var script = document.createElement('script');
               // 拼接 url
               var url = req.url + '?callback=' + req.callback.name;
               // 赋值url
               script.src = url;
               // 放入头部
               document.getElementsByTagName('head')[0].appendChild(script);
           }
       </script>
       </body>
       </html>

 三、CORS是跨域资源共享(Cross-Origin Resource Sharing),以 ajax 跨域请求资源,支持现代浏览器,IE支持10以上

在CORS请求,头部信息中包含以下三个字段:

Access-Control-Allow-Origin: 该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求,

Access-Control-Allow-Credentials: 可选,值为布尔值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。这个值也只能设为true。如果要发送Cookie,Access-Control-Allow-Origin必须设置为必须指定明确的、与请求网页一致的域名

Access-Control-Expose-Headers:可选。CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-ControlContent-LanguageContent-TypeExpiresLast-ModifiedPragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定

详细讲解请查看阮大神的文章,传送门附上:CORS详解

四、iframe实现跨域

iframe(src){
            //数组
            if(Array.isArray(src)){
                this.docs.visible = true;
            }else{
                this.docs.visible = false;
                
            }
            this.link  = src
            if(this.docs.visible == false){
                if(this.$refs['ruleIframe'] && this.$refs['ruleIframe'].querySelector('iframe')){
                    this.$refs['ruleIframe'].querySelector('iframe').remove()    //删除自身
                }
                var iframe = document.createElement('iframe');
                iframe.width = '100%';
                iframe.height = '100%';
                iframe.setAttribute('frameborder','0')
                iframe.src = src;                
                this.append(iframe)
            }
            
        },
        //创建元素 防止  获取不到 ruleIframe 递归
        append(iframe){
            if(this.$refs['ruleIframe']){
                this.$refs['ruleIframe'].appendChild(iframe);
                return
            }
            setTimeout(()=>{
                this.append(iframe);
            },500)    
        },

感谢各位看官 阅读~

希望能帮助到大家

<think>嗯,用户想解决帆软报表和Vue项目之间的嵌套问题。首先,我需要回忆一下问题的常见原因和解决方案。根据他们提供的引用,通常是由于浏览器同源策略导致的,当iframe加载不同名的内容时,会被阻止访问。 首先,引用[1]提到帆软报表服务器和项目不在同一个,所以问题出现。解决方案可能涉及设置CORS头,比如Access-Control-Allow-Origin。然后引用[2]和[5]提到了使用postMessage方法进行Vue和iframe之间的通信,这应该是一个关键点,因为postMessage可以传递消息。需要详细说明如何在Vue中监听消息,以及帆软报表如何发送消息。 另外,引用[3]和[4]指出可能涉及X-Frame-Options或Nginx配置的问题。比如,X-Frame-Options设置为SAMEORIGIN会阻止iframe加载,所以需要检查服务器是否设置了这个头,并修改为ALLOW-FROM或者移除。同时,Nginx反向代理可能用来将不同名的请求代理到同一名下,从而避免。这需要配置Nginx的代理设置,比如添加CORS相关的响应头,或者代理帆软报表的请求到Vue项目的同一名下。 然后,可能的解决方案步骤应该是:1. 配置帆软服务器允许,设置CORS头;2. 使用postMessage进行通信;3. 调整X-Frame-Options;4. 使用Nginx反向代理统一名。另外,可能需要处理Cookie的SameSite属性,如果涉及认证的话,可能需要设置为None并Secure。 需要确保每一步都详细说明,比如如何设置响应头,如何编写Vue中的postMessage代码,如何配置Nginx等。还要注意引用对应的参考资料,比如引用[1]关于CORS设置,引用[2]和[5]关于postMessage的使用,引用[3]和[4]关于X-Frame-Options和Nginx配置。 可能还需要考虑安全性问题,比如确保postMessage的origin验证,避免恶意网站拦截消息。同时,Nginx配置的代理是否会影响现有服务,需要评估。此外,如果帆软报表服务器无法修改,可能需要反向代理作为解决方案。 总结下来,解决方案应该分步骤,涵盖服务器配置、前端通信、可能的代理设置,并且每个步骤都要有具体的操作方法,参考用户提供的引用内容,确保回答准确可靠。</think>### 分步解决方案:帆软与Vue嵌套问题 #### 1. **配置帆软服务器允许访问** - **添加CORS响应头** 在帆软报表服务器的配置中(如Tomcat或Nginx),添加以下响应头解决限制: ```nginx add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; ``` 若需限制特定名,将`*`替换为Vue项目名(如`http://localhost:8080`)[^1][^3]。 - **调整X-Frame-Options** 若页面提示`X-Frame-Options`阻止加载,需修改服务器配置: ```nginx add_header X-Frame-Options "ALLOW-FROM http://your-vue-domain.com"; # 或直接禁用(不推荐) # add_header X-Frame-Options ""; ``` 确保该配置与浏览器控制台报错一致[^4]。 #### 2. **Vue与帆软iframe间通信** - **使用`postMessage`传递数据** 在Vue中监听iframe消息并发送指令: ```javascript // Vue组件内监听消息 mounted() { window.addEventListener('message', (e) => { if (e.origin !== 'http://fanruan-server.com') return; // 验证来源 console.log('收到帆软数据:', e.data); }); }, methods: { sendToFanruan() { const iframe = document.getElementById('fanruan-iframe'); iframe.contentWindow.postMessage({ action: 'refresh' }, 'http://fanruan-server.com'); } } ``` 帆软报表页面需同步实现消息接收与响应逻辑[^2][^5]。 #### 3. **通过Nginx反向代理统一名** - **代理帆软请求至同名下** 修改Nginx配置,将帆软接口代理到Vue项目的名路径下: ```nginx location /fanruan/ { proxy_pass http://fanruan-server.com/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 可选:添加CORS头 add_header Access-Control-Allow-Origin $http_origin; } ``` 此时iframe的URL可改为同源路径(如`/fanruan/report123`)[^3]。 #### 4. **处理Cookie/Session问题** - **设置`SameSite`和`Secure`属性** 若涉及登录态,需修改Cookie属性: ```nginx # 帆软服务器配置 add_header Set-Cookie "sessionid=xxx; SameSite=None; Secure"; ``` 确保HTTPS环境且浏览器支持`SameSite=None`[^4]。 #### 5. **验证与调试** - 使用浏览器开发者工具检查: - 网络请求中`Response Headers`是否包含正确CORS头。 - 控制台是否报错`X-Frame-Options`或拦截。 - `postMessage`通信是否触发并安全过滤来源[^3]。 --- ### 相关问题 1. **如何避免`postMessage`通信被恶意网站劫持?** (需严格校验`event.origin`并限制操作权限) 2. **反向代理后帆软报表资源加载异常怎么办?** (检查代理路径是否完整,如静态资源路径需重写) 3. **HTTP与HTTPS混合环境如何适配?** (强制统一为HTTPS,避免协议不一致触发安全限制) --- ### 关键引用 - CORS配置与X-Frame-Options调整[^3] - `postMessage`实现通信[^2][^5] - Nginx反向代理与路径代理[^4]
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值