1 什么是域和跨域

  1. 什么是域:chengdong.com
  2. https://www.taobao.com:80
  3. https:协议
  4. www:子域名
  5. taobao.com:主域名
  6. 80:端口
  7. 域名:由协议、子域名、主域名、端口号组成,这四个组成部分只要有一个不一样,就叫做不同的域

2、不同的域

  1. 这两个域就是不同的域,因为其端口号不同
  2. http://47.108.197.28:3000/
  3. http://47.108.197.28:4000/
  1. http://aaa.baidu,com
  2. http://bbb.baidu.com
  3. http://music.baidu.com
  4. 当买了主域名之后,子域名是可以自己定义的,子域名不同,所以这里也是不同的域

3、同源和同源策略

  1. js出于同源策略的限制,不允许从一个域访问另一个域
  2. 同源:同一个域
  3. 什么是同源策略:就是js只允许同一个域之间相互访问

、如何实现跨域

4-1 服务器端实现跨域

  1. koa.js
  2. ctx.set("Access-Control-Allow-Origin","*")

Snipaste_2021-11-15_10-46-08.jpg

4-2 客户端实现跨域

4-2-1 使用jsonp去跨域

  1. Jsonp(JSON with Padding) json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据。
  1. # html
  2. $.ajax({
  3. url:'http://localhost:8080',
  4. dataType:"jsonp",
  5. method:"get",
  6. success:res=>{
  7. console.log(res);
  8. }
  9. })
  10. # js
  11. const koa = require("koa")
  12. const app = new koa()
  13. app.use(async ctx=>{
  14. let callbackName = ctx.query.callback || 'callback'
  15. // 返回jsonp
  16. var obj ={
  17. name:"cheng",
  18. age:18
  19. }
  20. ctx.body = callbackName + `(${JSON.stringify(obj)})`
  21. })
  22. app.listen(8080,()=>{
  23. console.log('服务器打开了');
  24. })

4-2-2 script

  1. script 不收同源策略的限制
  1. var script = document.createElement("script");
  2. script.src = "http://localhost:8080?&callback=handleResponse";
  3. document.body.prepend(script);
  4. function handleResponse(res) {
  5. // 对response数据进行操作代码
  6. console.log(res)
  7. }

4-2-3 中间件函数

  1. 因为每一个路由到下一个路由都会经过中间件函数,所以在中间件函数中设置了请求头,那么每一个路由就都有了请求头
  2. app.use(async (ctx,next)=>{
  3. ctx.set("Access-Control-Allow-Origin","*")
  4. await next()
  5. })

Snipaste_2021-11-16_11-00-18.jpg
方法3

  1. <script>
  2. $.ajax({
  3. url:"https://apis.map.qq.com/ws/location/v1/ip?key=7HQBZ-VO33U-SDWVK-BYWTK-TSJUZ-PLBDS&output=jsonp",
  4. dataType:"jsonp",
  5. success:res=>{
  6. console.log(res);
  7. }
  8. })
  9. </script>
  10. &output=json加上去