• 【面筋烧烤手册】HTTP数据传输专题


    网络数据传输专题

    1、Ajax请求五个步骤

    由js脚本发起HTTP请求,根据返回的数据,获取相应部分,并不用刷新页面

    • 例如:进行一次head请求

    • 创建多适配对象

    • 声明回调函数建立连接(配置请求方式)

    • 发送连接

    • 配置回调函数

      • 判断异步状态4
      • 判断交互状态200 304
      • 解析数据转成字符串
        • 是json类型对象Json.parse(res) 或 res.parseJson()
        • 不是json类型对象obj.toJsonString(); Json.stringify(obj)
    var xmlhttp;
    function loadXMLDoc(url)
    {
    xmlhttp=null;
    if (window.XMLHttpRequest)
      {// code for Firefox, Mozilla, IE7, etc.
      xmlhttp=new XMLHttpRequest();
      }
    else if (window.ActiveXObject)
      {// code for IE6, IE5
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    if (xmlhttp!=null)
      {
      xmlhttp.onreadystatechange=state_Change;
      xmlhttp.open("GET",url,true);
      xmlhttp.send(null);
      }
    else
      {
      alert("Your browser does not support XMLHTTP.");
      }
    }
    
    function state_Change()
    {
    if (xmlhttp.readyState==4)
      {// 4 = "loaded"
      if (xmlhttp.status==200)
        {// 200 = "OK"
        document.getElementById('p1').innerHTML=xmlhttp.getAllResponseHeaders();
        }
      else
        {
        alert("Problem retrieving data:" + xmlhttp.statusText);
        }
      }
    }
    
    • 例如:在用户输入文本时建立服务器通信
      在这里插入图片描述
    <html>
    <head>
    <script type="text/javascript">var xmlHttp=null;function showHint(str)
    {
    if (str.length==0)
      { 
      document.getElementById("txtHint").innerHTML="";
      return;
      }
    try
      {// Firefox, Opera 8.0+, Safari, IE7
      xmlHttp=new XMLHttpRequest();
      }
    catch(e)
      {// Old IE
      try
        {
        xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
      catch(e)
        {
        alert ("Your browser does not support XMLHTTP!");
        return;  
        }
      }
    var url="/ajax/gethint.asp?q=" + str;
    url=url+"&sid="+Math.random();
    xmlHttp.open("GET",url,false);
    xmlHttp.send(null);
    document.getElementById("txtHint").innerHTML=xmlHttp.responseText;
    }
    </script> 
    </head>
    <body><form> 
    First Name:
    <input type="text" id="txt1"
    onkeyup="showHint(this.value)">
    </form><p>Suggestions: <span id="txtHint"></span></p> </body>
    </html>

    2、Promise封装ajax

    /**
      * 封装一个函数 sendAJAX 发送 GET AJAX 请求
      * 参数   URL
      * 返回结果 Promise 对象
      */
     function sendAJAX(url){
         return new Promise((resolve, reject) => {
             const xhr = new XMLHttpRequest();
             xhr.responseType = 'json';
             xhr.open("GET", url);
             xhr.send();
             //处理结果
             xhr.onreadystatechange = function(){
                 if(xhr.readyState === 4){
                     //判断成功
                     if(xhr.status >= 200 && xhr.status < 300){
                         //成功的结果
                         resolve(xhr.response);
                     }else{
                         reject(xhr.status);
                     }
                 }
             }
         });
     }
    
     sendAJAX('https://api.apiopen.top/getJok')
     .then(value => {
         console.log(value);
     }, reason => {
         console.warn(reason);
     });
    

    3、Axios

    Axios官网教程 很详细了

    import axios from 'axios'
    //或者const axios = require('axios')
    const instance = axios.create({
        // url 是用于请求的服务器 URL
        url: '/user'
    
        // method 是创建请求时使用的方法
        method: 'get',    // default
    
        // baseURL 将自动加在 url 前面,除非 url 是一个绝对 URL
        // 它可以通过设置一个 baseURL 便于为 axios 实例的方法传递相对 URL
        baseURL: 'https://some-domain.com/api/',
    
        // transformRequest 允许在向服务器发送前,修改请求数据
        // 只能用在 PUT、POST 和 PATCH 这几个请求方法
        // 后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 Stream
        transformRequest: [function (data, headers) {
            // 对 data 进行任意转换处理
            return data;
        }],
    
        // transformResponse 在传递给 then/catch 前,允许修改响应数据
        transformResponse: [function (data) {
            // 对 data 进行任意转换处理
            return data;
        }],
    
        // headers 是即将被发送的自定义请求头
        headers: {'X-Requested-With': 'XMLHttpRequest'},
        
        // params 是即将与请求一起发送的 URL 参数
        // 必须是一个无格式对象 (plain object) 或 URLSearchParams 对象
        params: {
            ID: 12345
        },
    
        // paramsSerializer 是一个负责 params 序列化的函数
        // (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/)
        paramsSerializer: function (params) {
            return QS.stringify(params, {arrayFormat: 'brackets'})
        },
        
        // data 是作为请求主体被发送的数据
        // 只适用于这些请求方法 PUT、POST 和 PATCH
        // 在没有设置 transformRequest 时,必须是以下类型之一:
        // - string,plain object,ArrayBuffer,ArrayBufferView,URLSearchParams
        // - 浏览器专属:FormData,File,Blob
        // - Node专属:Stream
        data: {
            firstName: 'Fred'
        },
    
        // timeout 指定请求超时的毫秒数(0 表示无超时时间)
        // 如果请求花费了超过 timeout 的时间,请求将被中断
        timeout: 1000,
    
        // withCredentials 表示跨域请求时是否需要使用凭证
        withCredentials: false,    // default
        
        // adapter 允许自定义处理请求,以使测试更轻松
        // 返回一个 promise 并应用一个有效的响应(查阅 [response docs](#response-api))
        adapter: function (config) {
            /* ... */
        },
    
        // auth 表示应该使用 HTTP 基础验证,并提供凭据
        // 这将设置一个 Authorization 头,覆写掉现有的任意使用 headers 设置的自定义 Authorization 头
        auth: {
            username: 'janedoe',
            password: 's00pers3cret'
        },
    
        // responseType 表示服务器响应的数据类型,可以是 arraybuffer、blob、document、json、text、stream
        responseType: 'json',    // default
    
        // responseEncoding 表示对响应的编码
        // Note:对于 responseType 为 stream 或 客户端请求会忽略
        responseEncoding: 'utf-8',
    
        // xsrfCookieName 是用作 xsrf token 值的 cookie 名称
        xsrfCookieName: 'XSRF-TOKEN',    // default
    
        // xsrfHeaderName 是 xsrf token 值的 http 头名称
        xsrfHeaderName: 'X-XSRF-TOKEN',    // default
            
        // onUploadProgress 允许为上传处理进度事件
        onUploadProgress: function (progressEvent) {
            // ... ...
        },
        
        // onDownloadProgress 允许为下载处理进度事件
        onDownloadProgress: function (progressEvent) {
            // ... ...
        },
    
        // maxContentLength 定义允许的响应内容的最大尺寸
        maxContentLength: 2000,
        
        // validateStatus 定义对于给定的 HTTP 响应状态码是 resolve 或 reject promise。
        // 如果 validateStatus 返回 true (或者设置为 null 或 undefined),promise 将被 resolve,否则 promise 将被 reject
        validateStatus: function (status) {
            return status >= 200 && status < 300;    // default
        },
    
        // maxRedirects 定义在 node.js 中 follow 的最大重定向数目
        // 如果设置为 0,将不会 follow 任何重定向
        maxRedirects: 5,
    
        // socketPath 用于在 node.js 中定义 UNIX Socket
        // e.g. '/var/run/docker.sock' to send requests to the docker daemon.
        // 只能指定 socketPath 或 proxy,如果两者同时指定,将使用 socketPath
        socketPath: null,
    
        // httpAgent 和 httpsAgent 分别在 node.js 中用于定义在执行 http 和 https 时使用的自定义代理。
        // 允许像这样配置选项。keepAlive 默认没有启用
        httpAgent: new http.Agent({ keepAlive: true }),
        httpsAgent: new https.Agent({ keepAlive: true }),
    
        // proxy 定义代理服务器的主体名称和端口
        // auth 表示 HTTP 基础验证应当用于连接代理,并提供凭据
        // 这将会设置一个 Proxy-Authorization 头,覆写掉已有的通过使用 header 设置的自定义 Proxy-Authorization 头
        proxy: {
            host: '127.0.0.1',
            port: 9000,
            auth: {
                username: 'mikeymike',
                password: 'rapunz31'
            }
        },
    
        // cancelToken 指定用于取消请求的 cancel token
        cancelToken: new CancelToken(function (cancel) {
            // ... ...
        })
    })
    .then(function (response) {
        console.log(response.data);
        console.log(response.status);
        console.log(response.statusText);
        console.log(response.headers);
        console.log(response.config);
    })
    /*{
        // data 由服务器提供的响应
        data: {},
        
        // status 来自服务器响应的 HTTP 状态码
        status: 200,
    
        // statusText 来自服务器响应的 HTTP 状态信息
        statusText: 'OK',
    
        // headers 服务器响应的头
        headers: {},
    
        // config 是为请求提供的配置信息
        config: {},
    
        // request 是生成当前响应的请求
        // 在 node.js 中是最后一个 ClientRequest 实例 (在重定向中)
        // 在浏览器中是 XMLHttpRequest 实例
        request: {}
    }*/
    
    

    4、跨域

    没啥好说的 就看这篇了

    5、安全防攻击

    什么是xss?什么是csrf?⭐⭐⭐⭐⭐

    • xss脚本注入
      不需要你做任何的登录认证,它会通过合法的操作(比如在url中输入、在评论框中输入),向你的页面注入脚本(可能是js、hmtl代码块等)。
      • 防御
        编码:对用户输入的数据进行HTML Entity 编码。把字符转换成 转义字符。Encode的作用是将$ var等一些字符进行转化,使得浏览器在最终输出结果上是一样的。
        过滤:移除用户输入的和事件相关的属性。
    • csrf跨域请求伪造
      在未退出A网站的前提下访问B,B使用A的cookie去访问服务器
      • 防御:token,每次用户提交表单时需要带上token(伪造者访问不到),如果token不合法,则服务器拒绝请求

    OWASP top10 (10项最严重的Web应用程序安全风险列表)都有哪些?⭐⭐⭐

    • SQL注入

    • 在输入框里输入sql命令

    • 失效的身份验证

    • 拿到别人的cookie来向服务端发起请求,就可以做到登陆的目的

    • 敏感数据泄露

    • 明文传输状态下可能被抓包拦截,这时候就造成数据泄露
      想做到抓包,比如在网吧,共享一个猫上网,这时候抓包就可行,方法网上一搜一大把
      不过此风险大部分网站都能得到很好的解决,https或者md5加密都可以

    • XML 外部实体

    • 失效的访问控制

    • 安全配置错误

    • XSS

    • 不安全的反序列化

    • 使用含有已知漏洞的组件

    • 不足的日志记录和监控

    参考链接

    6、https

    https和http有什么区别,https的实现原理?⭐⭐⭐⭐⭐

    http无状态无连接,而且是明文传输,不安全
    https传输内容加密,身份验证,保证数据完整性

    https实现原理⭐⭐⭐⭐⭐

    首先客户端向服务端发起一个随机值,以及一个加密算法
    服务端收到后返回一个协商好的加密算法,以及另一个随机值
    服务端在发送一个公钥CA
    客户端收到以后先验证CA是否有效,如果无效则报错弹窗,有过有效则进行下一步操作
    客户端使用之前的两个随机值和一个预主密钥组成一个会话密钥,在通过服务端传来的公钥加密把会话密钥发送给服务端
    服务端收到后使用私钥解密,得到两个随机值和预主密钥,然后组装成会话密钥
    客户端在向服务端发起一条信息,这条信息使用会话秘钥加密,用来验证服务端时候能收到加密的信息
    服务端收到信息后返回一个会话秘钥加密的信息
    都收到以后SSL层连接建立成功

  • 相关阅读:
    JS组件系列——使用HTML标签的data属性初始化JS组件
    JS组件系列——分享自己封装的Bootstrap树形组件:jqTree
    JS组件系列——封装自己的JS组件,你也可以
    JS组件系列——Bootstrap 树控件使用经验分享
    JS组件系列——Bootstrap Select2组件使用小结
    面试干货——年底干货大放送,你准备好了吗?
    JS组件系列——基于Bootstrap Ace模板的菜单和Tab页效果分享(你值得拥有)
    JS组件系列——Form表单验证神器: BootstrapValidator
    HTTPS的加密过程
    Http知识总结
  • 原文地址:https://www.cnblogs.com/SiriusZHT/p/14365040.html
Copyright © 2020-2023  润新知