最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 跨域CORS、JSONP、服务器中转

    正文概述 掘金(努力了吗梁同学)   2021-02-14   549

    1、同源策略

    当两个服务器的 源 不完全相同的时候,无法获取另一个的数据。不同的页面,无法相互访问数据。

    1.1 获取网站的源

    window.origin
    或
    location.origin
    

    1.2 判断源是否相同

    源 = 协议 + 域名 + 端口号

    2、跨域

    为了解决同源策略无法相互访问数据

    其中两种跨域的方法:CORS、JSONP

    2.1 CORS

    在后端设置响应头,提前声明允许谁获取数据。

    response.setHeader("Access-Control-Allow-Origin", "允许的源地址,例如(http://baidu.com)")
    

    2.2 JSONP

    将数据写入到JS文件中,利用引用JS文件,将数据保存到window上。最后再利用window来获取JS保存的数据。

    2.3 服务器中转

    使用自己的服务器作为中转站,将需要请求的地址,发送给服务端。服务端不存在跨域问题,可以直接请求数据。返回给我们自己。

    中转服务器

    const http = require('http')
    const url = require('url')
    http.createServer((req, res) => {
      let urlObj = url.parse(req.url, true)
      if (urlObj.pathname === '/bridge') {
        http.get(urlObj.query.url, req => {
          let text = ''
          req.on('data', data => text += data)
          req.on('end', () => {
            res.setHeader('Access-Control-Allow-Origin', '*')
            res.end(text)
          })
        })
      } else {
        res.writeHead(404, 'Not Found')
        res.end('not found')
      }
    }).listen(8080)
    

    浏览器正常请求即可

    fetch('http://localhost:8080/bridge?url=' + encodeURIComponent('http://baidu.com'))
      .then(res => res.text())
      .then(data => console.log(data))
    

    3、JSONP封装

    3.1 方案1

    function jsonp(url) {
        return new Promise((resolve, reject) => {
            const random = 'JSONCallbackName' + Math.random()
            window[random] = data => {
                resolve(data)
            }
            const script = document.createElement('script')
            script.src = `${url}?callback=${random}`
            script.onload = () => {
                script.remove()
            }
            script.onerror = () => {
                reject()
            }
            document.body.appendChild(script)
        })
    }
    jsonp('访问数据的文件地址').then((data) => {
        console.log(data)
    })
    

    3.2 方案2

    服务端

    const http = require('http')
    const url = require('url')
    http.createServer((req, res) => {
      let urlObj = url.parse(req.url, true)
      if (urlObj.pathname === '/getWeather') {
        let data = { city: 'guangzhou', weather: 'sunny' }
        res.end(`${urlObj.query.callback}(${JSON.stringify(data)})`)
      } else {
        res.writeHead(404, 'Not Found')
        res.end('not found')
      }
    }).listen(8080)
    

    客户端

    function jsonp(url, data = {}) {
      return new Promise((resolve, reject) => {
        window.__jsonp__ = data => resolve(data)
        let script = document.createElement('script')
        let query = Object.entries(data).map(a => `${a[0]}=${a[1]}`).join('&')
        script.src = url + '?callback=__jsonp__&' + query
        script.onerror = () => reject('加载失败')
        document.head.appendChild(script)
        document.head.removeChild(script)
      })
    }
    
    jsonp('http://api.layouwen.com/getWeather.php', { city: '广州' }).then(data => {
      console.log(data)
    }).catch(e => console.log(e))
    

    起源地下载网 » 跨域CORS、JSONP、服务器中转

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元