zoukankan      html  css  js  c++  java
  • 基于nodejs中实现跨域的方法

        一般情况下跨域是通过ajax的方式请求数据,通过js在不同的域之间进行数据传输或者通信;

    只有通过ajax方式获取请求的时候才会有跨域问题需要解决;

    例如在本地模拟两个服务端。 一个服务端去通过ajax去请求另外一个服务端的数据的时候就会产生这个问题;

    const express = require('express');
    const path = require('path');
    
    const app = express();
    //托管静态资源
    app.use(express.static(path.join(__dirname,'public')));  
    
    //处理请求
    app.get('/',(req,res)=>{
         res.sendFile(path.join(__dirname,'./跨域ajax.html'));    
    });
    
    //处理ajax获取数据的路由
    app.get('/blog',(req,res)=>{
         let blogs = require('./blog.json');
        res.json(blogs);
    });
    
    app.listen(3000,()=>{
        console.log('3000 is on');
    })

    URL的详细格式是

    1.协议 http  https ftp  还有mongodb 等

    2.身份验证 ftp协议中有,http和HTTPS是没有的

    3.主机名 包括域名和ip两种形式;

    4.端口

    5.路径

    6.查询字符串

    7.哈希值

    在jquery的ajax方法的请求url中,如果协议,主机名,端口号有任何一个不同,name就属于跨域;域名和ip也是不等的,例如127.0.0.1和localhost是不等的;

    在web开发中,有一个著名安全 策略叫同源策略

    使用ajax请求数据的时候,值允许同域的请求,非同域的请求一概拒绝

    实现跨域请求一般三种方法。 通过cors  jsonp  代理

    第一种方式比较局限,需要服务端的代码在我的控制方为之内,

    后台提供的api我有权限去操作,只需要在服务端编写代码;浏览器端不需要编写任何代码;

    第二张方式是使用jsonp json with packing  将json数据包裹起来,json 作为参数,进行函数调用并且返回;需要有权限编写服务端的代码。如果请求另外一个非自己网站,就不行了;一个提供数据服务来提供api接口。一个提供http服务来显示页面。jsonp的原理就是自己创建一个script标签,由于script标签可以请求别的地址不收到限制; 所以可以自己写函数来创建script标签,src属性则是需要跨域请求的地址;

    function addScript(url){
       var script = document.createElement('script');
       script.src = url;     
       document.body.appendChild(script);
    }

     第三种方式采用代理的方式, 可以获取其他接口的数据

    代用代理的服务端代码如下

    const express = require('express');
    const path = require('path');
    const http = require('http');
    const app = express();
    app.use(express.static(path.join(__dirname, 'public')));
    
    app.get('/', (req, res) => {
        res.sendFile(path.join(__dirname, './ajax获取电影数据.html'));
    });
    
    app.get('/proxy', (req, res) => {
        //获取目标的url
        let url = req.query.url;
        //需要向目标url发送请求;
        //将数据请求回来
        http.get(url, (response) => {
            let str = '';
            //以流的方式接受数据
            response.on('data', (chunk) => {
                str += chunk;
            });
            response.on('end', () => {
                //接受所有数据之后,返回str
                res.json(str);
            });
        });
    });
    app.listen(3000, function() {
        console.log('App listening on port 3000!');
    });

    客户端代码如下

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <script src="js/jquery-1.11.3.js"></script>
    </head>
    
    <body>
        <h2>get movie</h2>
        <button type="button" id="button">get movie</button>
        <script>
            $('#btn').on('click', function() {
                $.ajax({
                    url: '/proxy',
                    type: 'get',
                    data: {
                        url: 'http://m.maizuo.com/v4/api/billboard/home?__t=1489757848973'
                    },
                    dataType: 'json',
                    success: function(res) {
                        console.log(JSON.parse(res));
                    }
                })
            })
        </script>
    </body>
    
    </html>
    

      

  • 相关阅读:
    001-nginx基础配置-location、Rewrite、return 直接返回码、全局变量
    001-Spring Cloud Edgware.SR3 升级最新 Finchley.SR1,spring boot 1.5.9.RELEASE 升级2.0.4.RELEASE注意问题点
    004-读书记录
    007-ant design 对象属性赋值,双向绑定
    006-ant design -结合echart-地址map市
    005-ant design -结合echart
    002-Spring Framework-Core-01-IoC容器
    003-驾照考试,总结
    006-markdown基础语法
    java-mybaits-010-mybatis-spring-使用 SqlSession、注入映射器
  • 原文地址:https://www.cnblogs.com/qqfontofweb/p/6777794.html
Copyright © 2011-2022 走看看