• 同源策略 跨域


    关于同源策略

      同源指的是: 协议 , 域名 , 端口 三个完全相同。只有浏览器有同源策略。

      同源策略的作用:  为了用户数据的安全,防止恶意窃取用户数据。如果没有同源策略,浏览器会变得很不安全。

      当不同源的时候,也就是协议 或 域名 或 端口 不一样的时候,去请求数据就会产生跨域。

    同源策略的本质

      其实跨域的时候是可以发送ajax请求的,而且请求是成功的,返回的结果也拿了回来,但是浏览器不让用,会报跨域错误。

      浏览器不让用?(用ajax请求返回的数据中带着响应头,响应头中记录着数据来源的ip地址,但是当前浏览器地址栏中的ip地址响应头中的ip地址不同,所以浏览器不让用)

     

    解决办法?  cors

      在服务端配置响应头:   将返回结果中的响应头的ip地址 和  当前网页中的ip地址 设置成一致的,就可解决 

       //在node.js中的解决方法     这样写每个返回的数据都要改   
        res.writeHead(200,{//只修改了一个
          "Access-Control-Allow-Origin":"客户端网页地址",   // 将这里的网址写为 当前网页的地址
          "Content-Type":"application/json;charset=utf-8" //内容类型,返回json });
       res.write(JSON.stringify(result));
       res.end();

      

       //在app.js中,使用中间件的方式,  提前改好,   一劳永逸
        const cors = require("cors"); //引入cors模块,用来实现跨域
        server.use(cors({
        origin:["http://127.0.0.1:8080",  //将返回结果的响应头中的ip地址修改为 和当前网页的地址一致
        "http://localhost:8080"],//大括号中写的是当前网页的地址
        credentials:true  //允许接收客户端带来的身份信息
        }))

    jsonp解决跨域

    jsonp原理?:客户端动态创建script ,借助script发送跨域请求, 服务器端将要返回的数据填充进 js语句里返回,script收到js语句后执行js语句

             客户端动态创建script标签,借助script标签发送跨域请求,服务器端返回一个函数调用,将数据填充到函数调用中

    jsonp不支持post请求

    // jsonp 原理:
    // 前端:
    // 1. 声明一个全局函数
    // 2. 动态创建 script 标签, 将 函数名 通过 callback 传递给 后台

    // 后台:
    // 1. 根据 callback 获取函数名   
    // 2. 返回函数调用, 调用参数就是 json 数据

    01 利用了script标签可以跨域请求的特性,不受同源策略的限制

    02后台返回一个 函数调用

    ajax和jsonp的关系???

        它们没有任何关系

    jsonp只能通过 get 方式请求

    dataType:'jsonp'  ,其实是动态创建<script>, 借助<script>发送跨域请求,必须有服务器的支持

    全名JSON with PADDING    填充式JSON

    方案一: 用<scritp src="服务端接口地址"代替$.ajax发送请求" ></script>

        服务端:将要发送的数据填充在一条js语句中      res.write( `document.write('${day}')`)

        客户端:<script src="服务端接口地址"></script>,发送请求到服务端,并能接受到服务端返回的js语句字符串

        script只要收到 js语句,就会立刻自动执行

    问题:要在客户端执行的语句,在服务端写死了,重口难调

    代码如下:

     1 //服务器
     2 //引入支持接收请求,返回响应的模块http
     3 const http=require("http")
     4 //创建服务器程序实例
     5 http.createServer(
     6       //每当有客户端发来请求时,自动调用一下回调函数
     7       (req,res)=>{
     8             var day='北京 晴 18~32度'
     9 
    10             res.writeHead(200,{//可选,将字转为utf-8格式  将来ajax自带utf转码
    11                   "Content-Type":"text/plain; charset=utf-8"
    12             })
    13         
    14             res.write( `document.write('${day}')`)    
    15             res.end(); 
    16       }
    17 ).listen(8888)
    <!-- 客户端 -->
    <!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>
    </head>
    <body>
                      
    <script src="http://localhost:8888"> </script>  <!-- 向服务器发送请求,并接收数据,这个数据要:js语句 -->
    
    </body>
    </html>

    方案二:提前在客户端定义一个函数,用于处理服务端返回的请求,服务端仅使用函数名拼接一条函数调用的js语句

      客户端: function show (day){  // 客户端定义一个函数

        任意js语句

      }

      客户端利用scrtpt发送请求,并接收 服务器端  发回来的参数( `show('${day}')`)  

      服务端:     res.write( `show('${day}')`)     //  服务器拼接一个js调用语句 show()

    问题:  本该定义在客户端的函数名,在服务端是写死的,重口难调

    代码如下

     1 //服务器
     2 //引入支持接收请求,返回响应的模块http
     3 const http=require("http")
     4 //创建服务器程序实例
     5 http.createServer(
     6       //每当有客户端发来请求时,自动调用一下回调函数
     7       (req,res)=>{
     8             var day='北京 晴 18~32度'
     9 
    10             res.writeHead(200,{//可选,将字转为utf-8格式  将来ajax自带utf转码
    11                   "Content-Type":"text/plain; charset=utf-8"
    12             })
    13         
    14             res.write( `show('${day}')`)    
    15             res.end(); 
    16       }
    17 ).listen(8888)
     1 <!-- 客户端 -->
     2 <!DOCTYPE html>
     3 <html lang="en">
     4 <head>
     5       <meta charset="UTF-8">
     6       <meta name="viewport" content="width=device-width, initial-scale=1.0">
     7       <meta http-equiv="X-UA-Compatible" content="ie=edge">
     8       <title>Document</title>
     9 </head>
    10 <body>
    11 
    12 <script>
    13       var show=(day)=>{
    14             // document.write(day)
    15             alert(day)
    16       }     
    17      
    18 </script>
    19 
    20 
    21                   
    22 <script src="http://localhost:8888"> </script>  <!-- 向服务器发送请求,并接收数据,这个数据要:js语句 -->
    23                <!-- script向服务端请求回来的数据是   `show('${day}')` -->
    24 
    25 </body>
    26 </html>

     

    还会更新。。。。。木有写完

  • 相关阅读:
    Android 默认壁纸 简单分析
    Makefile中override 指示符
    在linux内核中 读写上层文件
    Sqlite数据库操作的sql操作语句
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Spring_lookup-method
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Spring_lifecycle-init
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Spring_lifecycle-destroy
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Spring_GetFieldFactoryBean
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Spring_BeanNameAware
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Spring_abstract
  • 原文地址:https://www.cnblogs.com/javascript9527/p/11328432.html
Copyright © 2020-2023  润新知