常见跨域介绍及处理方式

  • 1、 简单介绍

跨域即同源策略,是浏览器的核心安全功能,指的是一个域下的文档或脚本试图去请求另一个域下的资源,如果缺少了同源策略,浏览器很容易收到XSS、CSFR攻击,所谓同源是指"协议+域名+端口"三者相同,即使两个不同域名指向同一个ip,也非同源

  • 2、处理跨域方式

    • 1、JSONP(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据
      请求示例:
      <!DOCTYPE html>
      <html>
         <head></head>
         <body>
         	<script>
               function getData(data) {
                 console.log(data);
               }
             </script>
             <script src="http://localhost:8080/api/data?cb=getData"></script>
         </body>
      </html>
      
      服务端处理方式:
      const http = require('http')
      const url = require('url')
      
      const app = http.createServer((req, res) => {
      let urlObj = url.parse(req.url, true)
      
      switch (urlObj.pathname) {
          case '/api/data':
            res.end(`${urlObj.query.cb}({"name": "gp145"})`)
            break
          default:
            res.end('404.')
            break
        }
      })
      
      app.listen(8080, () => {
        console.log('localhost:8080')
      })
      
    • 2、CORS
      const http = require('http')
      const url = require('url')
      const querystring = require('querystring')
      
      const app = http.createServer((req, res) => {
        let data = ''
        let urlObj = url.parse(req.url, true)
      
        res.writeHead(200, {
          'content-type': 'application/json;charset=utf-8',
          'Access-Control-Allow-Origin': '*'
        })
      
        req.on('data', (chunk) => {
          data += chunk
        })
      
        req.on('end', () => {
          responseResult(querystring.parse(data))
        })
      
        function responseResult(data) {
          switch (urlObj.pathname) {
            case '/api/login':
              res.end(JSON.stringify({
                message: data
              }))
              break
            default:
              res.end('404.')
              break
          }
        }
      })
      
      app.listen(8080, () => {
        console.log('localhost:8080')
      })		
      
      • 3、middleware
      const http = require('http')
      const proxy = require('http-proxy-middleware')
      
      http.createServer((req, res) => {
        let url = req.url
      
        res.writeHead(200, {
          'Access-Control-Allow-Origin': '*'
        })
      
        if (/^\/api/.test(url)) {
          let apiProxy = proxy('/api', { 
            target: 'https://m.lagou.com',
            changeOrigin: true,
            pathRewrite: {
              '^/api': ''
            }
          })
      
          // http-proy-middleware 在Node.js中使用的方法
          apiProxy(req, res)
        } else {
          switch (url) {
            case '/index.html':
              res.end('index.html')
              break
            case '/search.html':
              res.end('search.html')
              break
            default:
              res.end('[404]page not found.')
          }
        }
      }).listen(8080)
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值