简介
- request事件
request事件发生于网络连接建立,客户端向服务器端发送报文,服务器端解析报文,发现HTTP请求的报头时。 -
request事件侦听器:高阶函数
传递给createServer()方法一个function(req,res){}这类函数做参数即可。
Express的原理即是如此:app就是一个函数作为request事件的侦听者
基础功能
- 报文首行:req.method + req.url +http版本
- 报文头部:req.headers;
- 请求方法:req.method;
- 路径解析:req.url;Node提供url模块—url.parse();
- 客户端代理(浏览器)会将完整的url地址解析成报文,将路径和查询部分放在报文头,hash部分会被丢弃;
- 查询字符串:?x1=x&x2=x;Node提供querystring模块将其转为JSON对象—querystring.parse(url.parse(req.url).query);=== url.parse(req.url, true).query;若字符串中的键出现了多次,它的值是一个数组;
- cookie:标识和认证一个用户;
- session(有效期通常20min):解决cookie敏感数据的保护无效问题(前端可以通过document.cookie修改)—存于服务器端,数据安全性得到一定保障,而且数据也无须在协议中每次都被传递;
(1)session与内存:采用专门的缓存服务—redis、memcached等;
- 原因:
- Node与缓存服务保持长连接而非短链接,握手延迟只影响初始化;
- 高速缓存直接在内存中进行数据存储和访问;
- 缓存服务通常与node进程运行在相同的机器或机房,网络速度受到的影响较小;
- 优点
- 解决node的内存上限问题—性能问题;
- 解决多个node进程之间内存不共享的问题—session集中化;
- 缺点:相比直接在内存中访问慢;
- 缓存
- Basic认证
- 数据上传:http模块只对http报文的头部进行了解析,然后触发request事件,其内容部分通过data事件触发,以流的方式处理—将接收到的Buffer列表转化为一个Buffer对象后,再转为没有乱码的字符串;
(1)表单数据:请求头:Content-Type: application/x-www-form-urlencoded;其报文体内容与查询字符串相同,通过querystring.parse()解析;
(2)JSON文件:请求头:Content-Type: application/json;使用JSON.parse()处理;
(3)XML文件:请求头:Content-Type: application/xml;通过xml2js库将xml文件转为json对象:xml2js.parseString;
XML文件解析
- 附件上传
- 普通表单:Content-Type: application/x-www-form-urlencoded—内容通过urlencode的方式编码内容形成报文体,再发送给服务器端;
- 含文件的表单(file类型的控件):指定Content-Type: multipart/form-data;
file控件的表单在浏览器构造的请求报文头
- boundary=随机字符串xx用以分割报文体的内容:报文体的内容将通过在xx签名添加--进行分割,报文结束后在xx前后添加--标识结束;
- Content-Length:必须确保报文体的长度;
eg:上传div.js文件,其生成的报文体如下:
第一个Content-Disposition是普通的表单控件,第二个是file控件:其name对应表单控件的name属性
- node层处理—formidable模块:当接收大小未知的数据量时需要异步处理—基于流式处理解析报文,将接收到的文件写入系统的临时文件夹中,并返回对应的路径;
业务逻辑只要检查req.body和req.files即可
- 数据上传与安全
(1)内存限制
- 问题描述
在解析JSON文件、xml文件和普通表单数据都是先保存用户提交的所有数据,然后再解析处理,最后才传递给业务逻辑—仅适合数据量小的提交请求,攻击者通过客户端模拟伪造大量数据,每次攻击者提供1M的内容,只要并发量一大,内存很容易被吃光; - 解决方案:
- 限制上传内容的大小,一旦超过限制,停止接收数据,响应400状态码;
- 通过流式解析,将数据导向磁盘中,Node只保留文件路径等小数据;
(2)csrf
网友评论