中企动力科技股份有限公司石家庄分公司,广西seo网站,最新网站开发建设教材,厦门做点击付费网站构建web应用
将从http模块中的服务器端中的request使劲按开始分析#xff0c;request时间发生于网络连接建立#xff0c;客户端想服务器发送报文#xff0c;服务器解析报文#xff0c;发现http请求的报文的时候#xff0c;在出发request事件之前#xff0c;已经准备好Se…构建web应用
将从http模块中的服务器端中的request使劲按开始分析request时间发生于网络连接建立客户端想服务器发送报文服务器解析报文发现http请求的报文的时候在出发request事件之前已经准备好ServerRequest和ServerResponse对象以供请求和响应报文的操作。
var http require(http)
http.createServer(function(req, res) {res.writeHead(200,{Content-Type:text/plain})res.end(1337,127.0.0.1://1337/)
})请求方法的判断URL的路径解析URL中查询字符串解析Cookie的解析Basic认证表单数据的解析任意格式文件的上传处理
请求方法
HTTP_Parser解析请求报文的时候将报文头抽取出来设置为req.method通常只要处理get和post请求方法但是在RESTful类的web服务器中请求方法十分重要会决定资源的操作行为PUT代表新建一个资源post表示更新一个资源get表示查看一个资源。delete表示删除一个资源。
路径解析
HTTP_Parser会解析req.url,路径解析伪代码如下
function(req, res) {var pathname url.parse(req.url).pathnamefs.readFile(path.join(ROOT, pathname),function(err, file) {if(err) {res.writeHead(404)res.end(找不到文件)return}res.writeHead(200)res.end(file)})
}查询字符串
?foobarbazval字符串就是查询字符串形成请求报文首行的第二部分。 转换为JSON对象
var url require(url)
var querystring require(querystring)
var query querystring.parse(url.parse(req.url).query)
//
var query url.parse(req.url, true).query业务的判断要检查值是数组还是字符串否则会出现typeerror的情况。
Cookie
Cookie认识
Cookie的处理主要分为如下几步
服务器向客户端发送cookie浏览器将cookie保存之后浏览器每次都会将cookie发回客户端 客户端发送的cookie在请求报文的cookie字段中HTTP_Parser会将所有的报文字段解析到req.headers上这个cookie就是req.headers.cookies,根据规范中的定义cookie的值是keyvalue,key2value2的形式如果需要cookie解析起来不难
var parseCookie function(cookie) {var cookies {}if (!cookie) {return cookies}var list cookie.split(;)for(let i 0; i list.lenght; i) {var pair list[i].split()cookies[pair[0].trim()] pair[1]}return cookies
}function (req, res) {req.cookies parseCookie(req.headers.cookie);hande(req, res);
}
var handle function (req, res) {res.writeHead(200);if (!req.cookies.isVisit) {res.end(第一次连接 );} else {res.writeHead(200)res.end(再次连接)}
};Set-Cookie: namevalue; Path/; ExpiresSun, 23-Apr-23 09:01:35 GMT; Domain.domain.com
path path表示这个cookie影响到的路径当前访问的路径不满足该匹配浏览器不会发送这个cookieExpires Max-Age: 告知浏览器这个Cookie何时过期如果不设置该选项在关闭浏览器的时候会丢失这个cookie如果设置了过期时间浏览器会将cookie内容写入到磁盘中保存。Expires的值是一个UTC格式的时间字符串告知浏览器啥时候过期Max-Age告知浏览器Cookie多久后过期如客户端的时间和服务器的时间不能匹配这种时间设置就会出现偏差HttpOnly告知浏览器不允许通过脚本document.cookie去更改这个cookie值Secure: 当Secure的值为true在HTTP中是无效的在HTTPS中才有效表示创建的Cookie只能在HTTPS连接中被浏览器传送到服务器端进行会话验证如果HTTP连接则不会传递该信息所以很难被窃听到。
Cookie的性能的影响
由于cookie的实现之际一旦服务器向客户端发送了设置cookie的意图除非cookie过期否则大部分的客户端每次都会请求发送这些cookie到服务器端一旦设置的cookie过多会导致报头比较打大多数的cookie并不需要每次都用上会造成带宽的部分浪费。
减小cookie的大小 更严重的是如果域名在根节点设置cookie几乎所有的子路径下的请求都会带上这些cookie这些cookie在某些情况下是有用的但是有些情况下是完全无用的静态文件最为典型静态文件的业务定位不关心状态cookie对它而言几乎无用但是一旦又cookie设置到相同的域下请求就会带上cookie。为静态组件使用不同的域名 为不需要cookie的组件换个域名可以实现减少无效的cookie的传输多有很多网站的静态文件会有特别的域名使得业务相关的cookie不会影响静态资源还可以突破浏览器下载线程数量的限制因为域名不同可以将下载线程数范围翻倍。但是换用额外的域名会多dns解析减少DNS查询 由于现在的浏览器都会进行DNS缓存。
Session
通过Cookie浏览器和服务器可以实现状态的记录但是cookie可以在前端和后端进行修改数据就容易被伪造和篡改。 为了解决Cookie敏感数据的问题Session出现了这个Session的数据只保存在服务器端客户端无法修改这样数据的安全性得到一定的保证
基于cookie来实现用户和数据的映射
将所有数据都放在Cookie中不可取但是将口令放在Cookie中还是可以的。因为口令一日被篡改就丢失了映射关系也无法修改服务器端存在的数据了。并且Session的有效期通常较短,普遍的设置是20分钟如果在20分钟内客户端和服务器端没有交互产生服务器端就将数据删除。由于数据过期时间较短,且在服务器端存储数据,因此安全性相对较高 一旦服务器启用了Session, 将会约定一个键值作为Session口令这个值可以任意约定一旦服务器检测到用户请求cookie中没有携带该值就会生成一个值这个值是唯一而且不重复的值并设定超时时间。
var sessions {}
var key session_id
var EXPIRES 20 * 60 * 1000
var generate function () {var session {}session.id (new Date()).getTime() Math.random()session.cookie {expire: (new Date()).getTime() EXPIRES}sessions[session.id] session;return session
}每个请求到来的时候会检查cookie中口令和服务器端的数据如果过期就会重新生成
function(req, res) {var id req.cookies[key]if(!id) {req.session generate() } else {var session sessions[id]if(session) {if(session.cookie.expire (new Date()).getTime()) {// 超时session.cookie.expire (new Date()).getTime() EXPIRESreq.session session} else {delete session[id]req.session generate()}}else {req.session generate()}}handle(req, res)
}仅仅重新生成Session不能完成整个流程还需要在响应给客户端的时候设置新的值以便下次请求时候能够对应服务器端的数据
var writeHead res.writeHead;
res.writeHead function() {var cookies res.getHeader(Set-Cookie)var session serialize(Set-Cookie,req.session.id)cookies Array.isArray(cookies)?cookies.concat(session):[cookies, session];res.setHeader(Set-Cookie, cookies)return writeHead.apply(this, arguments)
}至此session在前后端进行对应的过程就完成了这样的业务可以判断和设置session来维护用户和服务器端的关系
//服务器代码
var handle function(req, res) {if(!req.session.isVisit) {res.session.isVisit true;res.writeHead(200);res.end(欢迎第一次来到动物园);}else {res.writeHead(200);res.end(动物园再次欢迎你);}
}通过查询字符串来实现浏览器端和服务器端数据的对应
检查请求的查询字符串如果没有值就会先生成带值的URL然后形成跳转让客户端重新发起请求用户访问一个目录如果发现查询字符串中不带有session_id参数就会将用户跳转到带有session_id的地址中如果浏览器受到302状态码和location包头就会发起新的请求。
Session和内存
Session和安全