解决跨域的三种方法

解决跨域方法

一.为什么会产生跨域问题

          其实就是出于浏览器自身的的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)。

当一个请求的url的协议、域名、端口三者只要有一个与当前页面的url不同则会出现跨域问题

在这里插入图片描述

二.解决跨域的方式

2.1在服务端设置请求头,一般都是用于项目测试阶段。
Access-Control-Allow-Credentials属性代表后端允许发送Cookie
Access-Control-Allow-Origin属性代表允许访问的域(协议+域名+端口)如果设置为*代表允许全部访问
Access-Control-Allow-Methods属性代表允许请求的方式

小栗子:

2.1cors解决跨域

html部分

<!DOCTYPE html>

<html lang="en">

<head>

  <meta charset="UTF-8">

  <meta http-equiv="X-UA-Compatible" content="IE=edge">

  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <title>Document</title>

  <link rel="stylesheet" href="/home.css">

</head>

<body>

  <h1>首页</h1>

src="/home.js"></script>

</body>

</html>

js部分

// 开始发送请求

function fn() {

  const xhr = new XMLHttpRequest()

  xhr.open('GET', 'http://localhost:8081/list')

  xhr.onload = function () {

    const res = JSON.parse(xhr.responseText)

    console.log(res)

  }

  xhr.send()

}

fn()

// 开始发送请求

function fn2() {

  const xhr = new XMLHttpRequest()

  xhr.open('GET', 'http://localhost:8081/info')

  xhr.onload = function () {

    const res = JSON.parse(xhr.responseText)

    console.log(res)

  }

  xhr.send()

}

fn2()

css部分

body {

  background-color: skyblue;

}

node部分

/*

  注意: 数据接口服务器, 负责提供 STATIC 8080

*/   

// 导入响应的模块

const http = require('http')

const path = require('path')

const url = require('url')

const fs = require('fs')

// 创建服务

const server = http.createServer((req, res) => {

  // 1. 拿到本次请求的请求地址(地址和参数分开)

  const { pathname } = url.parse(req.url, true)

  // 2. 根据拿到的单独的请求地址, 解析出后缀名

  const { ext } = path.parse(pathname)

  // 3. 根据不同的后缀准备不同的文件夹路径

  let dirname = ''

  switch (ext) {

    case '.html': dirname = 'views'; break                

    case '.css': dirname = 'css'; break          

    case '.js': dirname = 'js'; break            

  }      

  // 4. 判断准备返回给前端

  if (/^\.(html|css|js)$/ig.test(ext)) {

    fs.readFile(`./client/${ dirname }/${ pathname }`, 'utf-8', (err, data) => {

      if (err) return console.log(err)

      // 把读取到的文件内容返回给前端

      res.end(data)

    })

  }

})

// 监听端口号

server.listen(8080, () => console.log('启动服务器成功 ^_^'))

2.2JSONP

JSONP 是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,兼容性好(兼容低版本IE),缺点是只支持get请求,不支持post请求。

核心思想:网页通过添加一个< script >元素,向服务器请求 JSON 数据,服务器收到请求后,将数据放在一个指定名字的回调函数的参数位置传回来。JSONP是解决跨域的方法之一,它与AJAX并无任何关联。

2.3proxy

代理服务器,跨域问题是浏览器的同源策略限制,服务器之间是没有的,那我们先把请求给我们的代理服务器,再让我们的代理服务器去调用这个接口,在发送给前端就可以了。不能和其它跨域方式并存。

module.exports = [

  {

    // 你要我代理的目标地址

    target: 'http://localhost:8081/list',

    // 代理标识符

    source: '/xhl'

  },

  {

    // 你要我代理的目标地址

    target: 'http://localhost:8081/info',

    // 代理标识符

    source: '/gx'

  },

  {

    // 你要我代理的目标地址

    target: 'http://localhost:8081/add',

    // 代理标识符

    source: '/abc'

  }

]

跨域这个问题,其实就是浏览器自己本身造成的,解决跨域的常用的就三种它们的占比:cors占4成 ,jsonp占2成,proxy占4成 。(部分代码替换即可未展示)欢迎大家来讨论呦

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值