zoukankan      html  css  js  c++  java
  • ali

    1.csrf攻击:

      1.Referer Check 同源策略检查,如果不是合法的地址,则(request:中 Referer:http://localhost:3000/)认为是csrf攻击

            2. token放在html中

            3.头部放入一个自定义的属性

    2.304的用处以及配置

    304是not modify,虽然归类到3重定向类,但响应不包含任何的主体部分.

    1.第一种方式     response: Last-Modified 和 reques: If-Modified-Since

        1.在请求头里有:If-Modified-Since: Mon, 17 Aug 2015 01:53:41 GMT
        2.在响应头里有:Last-Modified: Mon, 17 Aug 2015 01:53:41 GMT

    If-Modified-Since,和 Last-Modified 一样都是用于记录页面最后修改时间的 HTTP 头信息,

       1. Last-Modified 是由服务器往客户端发送的 HTTP 头,而 If-Modified-Since 则是由客户端往服务器发送的头,

       2. 再次请求本地存在的 cache 页面时,客户端会通过 If-Modified-Since 头将先前服务器端发过来的 Last-Modified 最后修改时间戳发送回去,

       3. 这是为了让服务器端进行验证,通过这个时间戳判断客户端的页面是否是最新的,如果不是最新的,则返回新的内容,如果是最新的,则 返回 304 告诉客户端其本地 cache 的页面是最新的,于是客户端就可以直接从本地加载页面了。

     2.第二种方式  respose:ETagsrequest: If-None-Match 

       1.客户端请求一个页面(A)。
       2.服务器返回页面A,并在给A加上一个ETag。
       3.客户端展现该页面,并将页面连同ETag一起缓存。 (缓存在:cache-control)
       4.客户再次请求页面A,并将上次请求时服务器返回的ETag一起传递给服务器。 (这是用 If-None-Matc 参数字段)
       5.服务器检查该ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304(未修改——Not Modified)和一个空的响应体。

       Etag 主要为了解决 Last-Modified 无法解决的一些问题。

             1、一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET;

        2、某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒)

        3、某些服务器不能精确的得到文件的最后修改时间;

    3.node设置头部的信息形成304:

      res.writeHead(200, {
        'Access-Control-Allow-Origin': '*',
        'Content-Type': 'image/png',
        'ETag': "666666",
        'Cache-Control': 'max-age=31536000, public',    1.public 代理服务器和客户端都缓存,新打开页面时缓存的 2.private 客户端缓存,代理服务器不缓存,新打开的重新向服务器发请求 

                              3.no-cache 需要与ETAG配合使用 4.no-store 都不会缓存到 internet临时我文件中 
        'Expires': 'Mon, 07 Sep 2026 09:32:27 GMT'       缓存的内容将在 某个时间点 GMT 失效, 这个选项只在HTTP 1.1可用, 并如果和Last-Modified一起使用时, 优先级较高
        })

    3.查询相同用户名的数量,使用having 作为条件

          SELECT NAME, count(*) AS c FROM USER
                        GROUP BY NAME HAVING c > 1;

    4.内存泄漏及排查方式,都是调用 v8-profiler + chrome dev tools

      1.easy-monitor

          2.heapdump

    查询地址: http://cnodejs.org/topic/58eb5d378cda07442731569f

    5.http 2.0 与http 1.0区别

      1.http与https

        1.http是直接建立在tcp上

            2.https是建立在 ssl/tls上,然后再建立在 tcp上

          node的创建方式是:port:443,require('https').createServer({key: key,cert: cert},app)

      2.http1.0 与 http1.1 区别

        1.添加了keep alive 保持长链接的的功能

        2.http1.0是If-Modified-Since 和 expires,http1.1则是添加了etag和if-None-Match

                3.错误通知的管理,新增了24个错误状态响应码,例如 409是conflict,410是 永久删除

      3.http 2.0与http1.1相比:

        1.多路复用,同一个链接并发处理请求,支持更多并发请求。避免再次建立重复链接。

        2.http1.1不支持头部的数据压缩,而http2.0支持头部数据压缩,数据的体积变小了,传输速度就会增快。

        3.http 1.x 的解析是基于文本, http 2.0协议解析决定采用二进制格式

               

    6.childprocess与cluster的区别

    cluster是childprocess和net的结合体。cluster内部是工作进程由child_process.fork()方法创建的。

    cluster方法

          事件:disconnect,exit,listenging,message,online

              方法:

            1.disconnect(): cluster调用了disconnect,则会使worker都调用自己的disconnect()方法退出。

            2.fork()

          属性:isMaster,isWorker

    判断是主进程还是子进程的方式:cluster.isMaster与cluster.isWorker

    进程worker的方法(注意clster没有这个方法)

          方法: send(),isConnect(),disconnect(),kill()

    关闭所有的进程以及主进程:if(cluster.isMaster) {cluster.disconnect(cb);}

    关闭子进程:if(cluster.isWorker){cluster.disconnect()};

    遍历所有的工作进程:cluster.workers 是工作进程的ids

    获取子进程

          在一个主进程里,可以使用cluster.workers来获取Worker对象。注意是真正的对象。

          在一个工作进程里,可以使用cluster.worker来获取Worker对象。

                      这里定义worker = cluster.worker

    获取子进程的id(不是pid,是索引,对应cluster.workers数组中的数组)

          worker.id

    子进程向主进程发送消息:

          worker.send('message');

    未找到主进程向子进程发送消息

    主进程接受信息:

          cluster.on('message', function(worker, message, haddle) {})

                      注意第一个参数不是message,是worker

     获取子进程的pid:

                     worker.process.pid

    杀掉这个pid的子进程(必须子进程调用,)

                    都是没有回调的

                    worker.disconnect() 

          worker.kill()

    主进程监听任意子进程退出并重启进程(注意必须是主进程)

                   cluster.on('exit', function(worker, code, signel) {

            cluster.fork();

                   })

      const http = require('http');
      const cluster = require('cluster');
      const cpuNums = require('os').cpus().length;

      if (cluster.isMaster) {
        for (var i = 0; i < cpuNums; i++) {
          cluster.fork();          //创建子进程,使用cluster.fork(),必须是主进程才能创建
        }
        cluster.on('message', function (worker, message, handle) {
          console.log(worker.process.pid, message);
        });
        cluster.on('exit', function (work, code, signel) {    //任意一个工作进程挂掉了,这个事件就会触发
          console.log('有个工作进程挂了')
          cluster.fork();
        })
      } else {
        http.createServer(function (req, res) {
          res.writeHead(200);
          res.end();
          var Worker = cluster.worker;
          Worker.send('shutdown');
          console.log(Worker.id)
          Worker.disconnect(function () {
            console.log(`杀掉${Worker.pid}`)
          });
        }).listen(9000);
        console.log(`工作进程${process.pid}已工作`)   //创建完子进程后,这一句会运行
      }

        

  • 相关阅读:
    experiment 2
    experiment 5
    php 代码审计之变量覆盖
    experiment 4
    experiment 3
    experiment 1
    2018铁三测评WP
    Lesson 1
    实验四、决策树算法及应用
    实验三 朴素贝叶斯算法及应用
  • 原文地址:https://www.cnblogs.com/jay--zhang/p/8075779.html
Copyright © 2011-2022 走看看