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}已工作`)   //创建完子进程后,这一句会运行
  }

    

原文地址:https://www.cnblogs.com/jay--zhang/p/8075779.html