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