跨域

什么是跨域?

  • 跨域其实是浏览器的同源策略造成的,它限制与其他源进行交互。而只有当协议,域名,端口相同的时候才是同源。
地址.png

如何解决跨域?
1.跨域资源共享(CORS)是一种机制,它允许浏览器向跨源服务器,发出XMLHttpRequest请求。实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。
浏览器讲CORS分为简单请求和非简单请求

  • 简单请求满足
    (1).请求方式只能为以下其中之一 get post head
    (2).同时请求头不能超过以下几种字段
  • Accept
  • Accept-Language
  • Content-Langua ge
  • Last-Event-ID
  • Content-Type
    后端则设置
"Access-Control-Allow-Origin"  // 支持什么域访问  * 为所有
"Access-Control-Allow-Credentials" // true 允许客户端请求携带验证信息,如cookie
"Access-Control-Request-Method" //支持的所有跨域请求的方法

其余都为非简单请求

  1. 第三方中间件
const cors = require("koa-cors");
app.use(cors());

3.nginx代理 (webpack配置文件也有代理)

location /api/ {
      # API Server
      proxy_pass http://www.a.com;  #将真正的请求代理到http://www.a.com
 }

4.JSONP (注意:仅支持 GET 方法)
jsonp 有的优势就是 script 加载 js 的优势

1.前端定义解析函数(例如 jsonpCallback=function(){....})
2.通过 params 形式包装请求参数,并且声明执行函数(例如 cb=jsonpCallback)
3.后端获取前端声明的执行函数(jsonpCallback),并以带上参数并调用执行函数的方式传递给前端。

// 后端
app.use(async (ctx, next) => { 
  if (ctx.path === "/api/jsonp"){
    const { cb, msg } = ctx.query; 
    ctx.body = `${cb}(${JSON.stringify({ msg })})`;    
    return; 
 }
});

// 前端
function cb(msg) {}
$.ajax({ 
   url: "http://localhost:8080/api/jsonp",  
  dataType: "jsonp",   
  type: "get",    
  data: { msg: "hello"},   
  jsonp: "cb",    
  success: function(data) { console.log(data);  }  });

5.window.postMessage
解决iframe跨域

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是跨域 跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实...
    Yaoxue9阅读 1,315评论 0 6
  • 一:什么是同源策略 同源策略是浏览器上为安全性考虑实施的非常重要的安全策略。 同源:URL由协议、域名、端口和路径...
    南方小小姑娘阅读 774评论 0 1
  • 什么是跨域 跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实...
    HeroXin阅读 847评论 0 4
  • 什么是跨域 跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实...
    他方l阅读 1,074评论 0 2
  • http协议 Resource,URL,Request,Response,Headers http 请求的是资源R...
    Sharise_Mo佩珊阅读 699评论 0 4