JS跨域及解决方式

882 阅读2分钟

什么是跨域(面试题)

请求如果触发了同源策略的话,会出现跨域的情况

什么是同源策略
 *     是浏览器的一种保护机制
 *        请求的时候  域名/协议/端口号有一个不一样
 *        就会触发同源策略,其实就是浏览器认为这个访问或者请求,不安全
 *        然后拦截掉了
 *        注意:请求此时是成功的!  只不过被浏览器拦截了
如何解决
 *      1.jsonp
 *          很早之前的解决方案,需要前后端配合
 *      2.cors
 *          是一种前端最喜欢的解决方案
 *      3.proxy
 *          不要和ES6数据代理联想到一起,只是重名
一般文件分为两部分
                1.文件名:让你能够区分文件差异
                2.文件后缀:给原本能够识别这个文件的软件看的
<script src="/static/js/index2.css"></script>

能够正常引入

        因为src属性并不看你引入的是否是一个js文件,他只会他这个地址的内容请求过来,然后执行一遍

        假设:一个后端地址内的代码是一串JS代码,如果我们通过src属性访问,那么会得到什么呢
后端服务器js文件开启接口服务器,静态服务器js文件开启静态服务器

1.jsonp

HTML文件书写代码

src属性,去到8081这个服务器的/a这个接口,拿到数据后,执行一遍 注意:必须是get方式

<script>
        function fn(res) {
            console.log('我是这个函数内部的代码,我的文件内,没有调用,',res)
        }
    </script>
    <script src="http://localhost:8081/a?callback=fn"></script>

后端服务器书写代码

server.get('/a',(req,res) => {
    console.log(req.query)
    const {callback} = req.query
    res.send(`${callback}({code:1,msg:'请求成功'})`)
})

2.cors

  • cors想法:前端向服务端发送请求,服务端返回内容的时候,告诉服务器,这是一个安全的请求,别拦截了
  • cors的书写不好背,所以推荐第三方包cors
步骤
  • 在前端服务器下载cors npm i cors
  • 在后端服务器中引入第三方包const cors = require('cors')
  • 调用cors : server.use(cors())

3.proxy

  • JS代码中修改ajax请求
    • xhr.open("GET", "/list");
    • xhr.open("POST", "/info");
// 前端的代码, 发送一个请求
function myAjax1() {
    const xhr = new XMLHttpRequest();
    // xhr.open("GET", "http://localhost:8081/list");
    xhr.open("GET", "/list");

    xhr.onload = function () {
        console.log(JSON.parse(xhr.responseText));
    };
    xhr.send();
}
myAjax1();

function myAjax2() {
    const xhr = new XMLHttpRequest();
    xhr.open("POST", "/info");
    xhr.onload = function () {
        console.log(JSON.parse(xhr.responseText));
    };
    xhr.send();
}
myAjax2();
  • 前端服务器:node中需要借助axios帮助我们发送请求,第三方包的流程:下载 导入 按照文档使用const axios = require('axios')
server.get('/list',(req,res) => {
  // console.log('如果我执行了,说明前端代码是请求我的')
  /**
   * node中需要借助axios帮助我们发送请求,第三方包的流程:下载  导入  按照文档使用
  */
  axios({
    method:'get',
    url:'http://localhost:8081/list',
  }).then(result => {
    // console.log(result.data)
    res.send(result.data)
  })
})
server.post('/info',(req,res) => {
  // console.log('如果我执行了,说明前端代码是请求我的')
  /**
   * node中需要借助axios帮助我们发送请求,第三方包的流程:下载  导入  按照文档使用
  */
  axios({
    method:'post',
    url:'http://localhost:8081/info',
  }).then(result => {
    // console.log(result.data)
    res.send(result.data)
  })
})