关于跨域的问题

什么是跨域?

要弄清跨域的问题,首先要了解的是浏览器的同源策略问题。那么,

什么是浏览器的同源策略呢?
同源策略是浏览器的一个安全策略,用来帮助阻挡恶意文档,减少被攻击的危险。

如果两个URL的协议、域名、端口三者完全一致的话,才可以加载src返回的内容。

如果违反了同源策略,将不能进行以下操作:

  • Cookie、localStorage、indexDB无法读写(其中可能包含了用户的信息)
  • DOM和JS对象无法获得(同源的JS只能获取自己源的DOM树)
  • AJAX请求被拦截(访问被阻隔)

跨域,即同源策略中三者其中某一项不能满足相一致,则会产生跨域问题。

如何解决跨域问题?

由于浏览器的同源策略产生的跨域请求,是开发中非常常见的问题。最重要的是如何解决跨域问题呢?

1. JSONP

通过添加script标签,向服务器请求JSON数据,服务器收到之后会将数据放在一个指定的函数中传回来。相当于另通了一个秘密通道用来传送数据。但是只支持get请求,是它的一大缺点。

    // js
    <script src="http://xxx.com/xx?callback=xxxxxx"></script>
    <script>
        function xxxxxx(res) {
            console.log(res)
        }
    </script>
    
    // jQuery Ajax
    $.ajax({
        url: 'xxxx',
        type: 'get',
        dataType: 'jsonp',
        jsonpCallback: 'handleCallback',
        data: {},
    })
    
    // Vue
    this.$http.jsonp('xxxx', {
        jsonp: 'handleCallback'
    }).then(res => {
        console.log(res)
    })

2. CORS

CORS即跨域资源分享(Cross-Origin Resource Sharing),后端在接受请求时,会在响应头上加上’Access-Control-Allow-Origin’,但是忽略了cookie的跨域。

如果需要携带Cookie跨域,前端需要配置

axios.defaults.withCredentials = true // Vue axios请求时是否需要使用凭证

CORS方式分为两种请求方式:

  1. 简单请求:HEAD,POST,GET
  2. 非简单请求:比如PUT.DELETE之类的特殊请求,或者Content-Type字段的类型是’application/json’
3. Nginx方向代理

在前端项目中配置proxyTable,存入服务端请求域名和Cookie里域名

何为代理呢?

代理即给某个对象提供一个代理对象,类似于中介的代理服务;

正向代理

举例:VPN。
正向代理服务器位于客户端和服务器之间,当客户端向服务端发送请求数据之后,代理服务器将服务器中的数据传送给客户端。

反向代理

客户端将请求发送到反向代理服务器上,代理服务器再去服务器中获取数据,再返回给客户端。相当于是对浏览器的一个“欺骗”过程,在浏览器上明面上是代理服务器的地址,而实际上访问的是目标服务器的地址,浏览器认为是访问的代理服务器的地址(与前端地址一致),则就符合了同源策略的规定。

正向代理和反向代理的区别就是,正向代理,代理的是客户端;反向代理服务,代理的是服务器。

反向代理通过对访问域名端口的更改,实现Nginx反向代理,解决跨域问题。

  • listen:用于配置网络监听
  • server_name:用于虚拟主机的配置
  • location:用于匹配的URL
  • proxy_pass:用于设置代理服务器的地址
  • index:用于设置网站的默认页
4. postMessage方法

通过postMessage方法,父窗口向子窗口发送信息,可以实现跨文本、多窗口、跨域信息传递

5. document.admin

设置两个页面相同的document.admin,就可以共享cookie

6. websocket协议

该协议可以实现浏览器与服务器全双工通信,但是浏览器一定要支持才行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值