美文网首页
前端跨域

前端跨域

作者: Viker_bar | 来源:发表于2020-01-10 15:23 被阅读0次

什么是跨域?

跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。
通常我们所说的跨域是狭义的,是由浏览器同源策略限制的一类请求场景

什么是同源策略?

同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同

常见跨域场景

跨域场景

解决方案

1、 通过jsonp跨域
2、 跨域资源共享(CORS)
3、 nginx代理跨域

一:通过jsonp跨域

/***
*  就是利用<script>标签没有跨域限制的“漏洞”来达到与第三方通讯的目的。
*  当需要通讯时,本站脚本创建一个<script>元素,地址指向第三方的API网址,
*  形如:<script src="http://www.baidu.com/api?param1=1&param2=2"></script>     
*  并提供一个回调函数来接收数据(函数名可约定,或通过地址参数传递)    
*  第三方产生的响应为json数据的包装(故称之为jsonp,即json padding),
*  形如:handleCallback({"name":"hax","gender":"Male"})     这样浏览器会调用callback函数,
*  并传递解析后  json对象作为参数
***/

//原生写法
var script = document.createElement('script');
script.type = 'text/javascript';

// 传参一个回调函数名给后端,方便后端返回时执行这个在前端定义的回调函数
script.src = 'http://www.baidu.com:8080/api?user=admin&callback=handleCallback';
document.head.appendChild(script);

// 回调执行函数
function handleCallback(res) {
    alert(JSON.stringify(res));
}

//jquery写法
$.ajax({
    url: 'http://www.baidu.com:8080/api',
    type: 'get',
    dataType: 'jsonp',  // 请求方式为jsonp
    jsonpCallback: "handleCallback",    // 自定义回调函数名
    data: {}
});

jsonp缺点:只能实现get一种请求。

二:跨域资源共享(CORS)

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源的限制。

CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10
(IE8/9需要使用XDomainRequest对象来支持CORS)

浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)
这里只介绍简单请求,非简单请求可点击这里

实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信

// 1:服务端不需要cookie信息的情况
前端:什么都不用做
后端:Access-Control-Allow-Origin :  //必须  http://domain.com 或 * 号
     Access-Control-Allow-Credentials  //可选
     Access-Control-Expose-Headers   //可选

// 2:服务端需要cookie信息的情况
前端:在AJAX请求中打开withCredentials = true
后端: Access-Control-Allow-Origin :  //必须  http://domain.com,且不能为 * 号 
      Access-Control-Allow-Credentials: //必须  true
      Access-Control-Expose-Headers: //可选

三:nginx代理跨域

server {
       listen       80;
       server_name m.youmias.com;

       location / {
           proxy_pass http://123.57.216.192:8080;  //个人公网ip
           proxy_set_header Host $host;
           proxy_redirect off;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_connect_timeout 60;
           proxy_read_timeout 600;
           proxy_send_timeout 600;
       }

       location /api {
           rewrite ^/api/(.*)$ /$1 break;
           proxy_pass http://123.57.216.192:8080; //个人公网ip
           proxy_set_header Host $host;
           proxy_redirect off;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       }

       error_page 404 /404.html;
           location = /40x.html {
       }

       error_page 500 502 503 504 /50x.html;
           location = /50x.html {
       }
   }

相关文章

  • 关于设置env等环境变量的思考

    1、如何处理跨域后台处理跨域前端处理跨域浏览器处理跨域 前端本地处理跨域:代理线上跨域的处理方式:Nginx反向代...

  • 跨域解决方案(史上最易懂)

    跨域总结 1.跨域思路 跨域解决方案一般分为两种:前端解决,后端解决 1.1 前端解决方案 通过前端解决的思想就是...

  • 浏览器跨域的那些事

    整理中 目标: 了解跨域 解决跨域 服务器配置跨域(java, nginx) 前端调试时配置解决跨域 一、什么是跨...

  • 前端跨域

    CORS跨域 1.CORS跨域-服务端设置,前端直接调用说明:后台允许前端某个站点进行访问 2.JSONP跨域-前...

  • vue-cli proxyTable配置

    前端的跨域转发 后端不需要配置,前端就可以实现跨域 proxyTable 的通常配置 这样就可以实现基本的跨域转发...

  • django跨域配置

    前言——跨域请求 前端对Cross-Origin Resource Sharing 问题(CORS,中文又称'跨域...

  • 前端请求

    node 简单跨域 前端简单请求

  • [mark]九种跨域方式实现原理

    前端如何使用proxyTable和nginx解决跨域问题 前言 前后端数据交互经常会碰到请求跨域,什么是跨域,以及...

  • 新增-后端跨域

    前端程序 后端程序 现在请求无法,到达需要解决跨域问题 每个servlet单独做跨域设置 跨域过滤器

  • webpack4基本使用(四)-跨域-环境变量

    16 wepack跨域问题 通过前端代理实现跨域 如果前端只是模拟数据时,我们可以使用devServer 自带的e...

网友评论

      本文标题:前端跨域

      本文链接:https://www.haomeiwen.com/subject/fxtmactx.html