当前位置: 首页 > news >正文

前后端分离产生的跨域问题的解决方案之--jsonp、nginx代理、设置头信息等

前言

在前后端没有分离的时候,前端开发要么是写静态页面,数据渲染后端来做,要么就是前端的页面和后端的代码刚开始的时候就合并在一起,每次后端代码更新了之后,前端也要更新一下代码,然后重启一下服务,还是比较麻烦的,而且前端要一直依赖于后端来开发。但前后端分离之后就不一样了,前端有更大的自由发挥性,现在应该绝大部分的公司都已经采取这种开发模式了。
前后端分离开发之后前后端只要定好接口文档,然后就根据文档各自开始开发了,在接口没好之前前端也可以使用模拟数据的插件来做接口数据模拟返回,等到后端接口写好之后再进行联调就好了,这样子又为开发大大的节约了时间。
前后端为我们带来那么大的便利,但也有它随之而来的缺点,那就是在项目开发时去请求同事的服务,由于浏览器同源策略的影响,就会出现跨域问题而无法收到后端接口返回的数据。

那么何种情况下算跨域了呢?

  • 对比网址 http://baidu.com/a.html

    • http://www.qq.com/a.html ----- 域名不同
    • http://www.baidu.com:8080/a.html ----- 端口不同
    • http://baike.baidu.com/a.html ----- 子域不同
    • https://baidu.com/a.html ----- 协议不同

跨域之后会造成

我们使用ajax去请求资源的时候,就会被使用同源策略进行检测,注意:同源策略是适用于浏览器的,也就是说如果我们发送了一个跨域的请求,服务器是能接收到请求的,也会把请求的数据返回给你,但浏览器在接收数据之后,会比较他们的域是否相同,如果不相同拒绝接收处理。

解决方案

1:后端代理
1.1 vue里的后端代理
在config文件下的index.js文件下配置:

proxyTable: {
    'api':{//将'http://www.test.com:8001/'映射为'api'
        target:'http://www.test.com:8001/',// 接口域名
        changeOrigin: true,//是否跨域
        pathRewrite: {
            '^/apis': ''   //需要rewrite的,
        } 
    },
}

1.1 nginx代理
找到nginx里conf下的配置文件nginx.conf,进行以下的修改

server {
    listen       80; #监听80端口,可以改成其他端口
    server_name  127.0.0.1; # 当前服务的域名

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location ^~/ {
        proxy_pass http://127.0.0.1:4302; #页面访问地址
        proxy_set_header X-real-ip $remote_addr;
        proxy_set_header Host $http_host;
    }

    location ^~/hs {
        proxy_pass http://10.65.7.114:8180/hs; #实际请求的接口配置
        proxy_set_header X-real-ip $remote_addr;
        proxy_set_header Host $http_host;
    }
}

注:在location里面配置页面的访问地址和要请求的接口地址。

2:jsonp请求
原理:我们会发现我们用script来引入文件的时候,地址不受同源策略的影响
2.1原生js解决跨域

<script>
    function callback(res){
        console.log(res.name);
    }
</script>
<script src="http://www.baidu.com/api.do?callback=callback"></script>

2.2用juery封装好的jsnop请求来解决跨域

$.ajax({
    url: "http://www.baidu.com/api.do",
    type: "GET",
    dataType: "jsonp", //指定服务器返回的数据类型
    success: function (res) {
       console.log(res);
    }
});

jsonp请求的缺点就是它只能发送get请求,有上传文件之类的需求就不适合用。

3:设置头信息方案
js 端的ajax请求:

$.ajax({
    url:'http://test.html',
    dataType:'json',
    type:'GET',
    beforeSend:function(xhr){
        xhr.setRequestHeader('Test','testheadervalue');
    },
    async: false,
    cache: false,
    success: function (res) {}
})

服务端设置:

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

/**表示的是访问服务端的ip地址及端口号,设置为*表示所有域都可以通过,一般来说不设置*,因为安全性能差,所以改成*/--->HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://10.80.6.111:8080");

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS,DELETE,PUT");

/**表示的是允许跨域的请求方法;*/

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Test");

/**表示的是允许跨域请求包含content-type头;*/

转载于:https://www.cnblogs.com/Ivy-s/p/9665047.html

相关文章:

  • 开篇:Pyhon基础笔记
  • 外国人又玩出新花样,仅需几行CSS代码就能让iPhone重启、Mac卡顿
  • SaaS技术栈的走势
  • 502错误,让你进一步明白nginx和php-fpm之间的关系
  • Oracle数据库-备份整个数据库与还原整个数据库数据
  • JVM:带你查看常见的问题,以及分析处方法
  • Mozilla开发全新的公开网络API WebXR 来实现增强现实
  • 2019物联网博览会
  • WPF实现QQ群文件列表动画(一)
  • 汉诺塔问题研究——分治法以及递归的设计技巧
  • Java 8: 从永久代(PermGen)到元空间(Metaspace)
  • 直接获取地址栏参数
  • SpringBoot中配置起动时的数据库初始化角本
  • 基于网页调用录音功能
  • metamask源码学习-controller-transaction
  • ----------
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • [Vue CLI 3] 配置解析之 css.extract
  • 【5+】跨webview多页面 触发事件(二)
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 2017-08-04 前端日报
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • Java小白进阶笔记(3)-初级面向对象
  • Material Design
  • Python连接Oracle
  • vue 个人积累(使用工具,组件)
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 大快搜索数据爬虫技术实例安装教学篇
  • 普通函数和构造函数的区别
  • 微服务入门【系列视频课程】
  • 异步
  • 【云吞铺子】性能抖动剖析(二)
  • 容器镜像
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • ${factoryList }后面有空格不影响
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (function(){})()的分步解析
  • (办公)springboot配置aop处理请求.
  • ***测试-HTTP方法
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .gitignore文件---让git自动忽略指定文件
  • .NET Core中的去虚
  • .NET Framework杂记
  • .NET开源项目介绍及资源推荐:数据持久层
  • .NET框架
  • @EnableConfigurationProperties注解使用
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [2016.7.Test1] T1 三进制异或
  • [Angular] 笔记 21:@ViewChild
  • [c#基础]DataTable的Select方法
  • [CISCN2021 Quals]upload(PNG-IDAT块嵌入马)
  • [corCTF 2022] CoRJail: From Null Byte Overflow To Docker Escape