@greenfavo
2016-10-27T15:04:40.000000Z
字数 5591
阅读 722
面试
阮一峰,玉伯,朴灵
JS的单线程是指一个浏览器进程中只有一个JS的执行线程,同一时刻内只会有一段代码在执行(你可以使用IE的标签式浏览试试看效果,这时打开的多个页面使用的都是同一个JS执行线程,如果其中一个页面在执行一个运算量较大的function时,其他窗口的JS就会停止工作)。
而异步机制是浏览器的两个或以上常驻线程共同完成的,例如异步请求是由两个常驻线程:JS执行线程和事件触发线程共同完成的,JS的执行线程发起异步请求(这时浏览器会开一条新的HTTP请求线程来执行请求,这时JS的任务已完成,继续执行线程队列中剩下的其他任务),然后在未来的某一时刻事件触发线程监视到之前的发起的HTTP请求已完成,它就会把完成事件插入到JS执行队列的尾部等待JS处理。又例如定时触发(settimeout和setinterval)是由浏览器的定时器线程执行的定时计数,然后在定时时间把定时处理函数的执行请求插入到JS执行队列的尾端(所以用这两个函数的时候,实际的执行时间是大于或等于指定时间的,不保证能准确定时的)。
所以,所谓的JS的单线程和异步更多的应该是属于浏览器的行为,他们之间没有冲突,更不是同一种事物,没有什么区别不区别的。
请求头部
If-Modified-Since
作用: 把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。
If-None-Match
作用: If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag. 使用这样的机制将提高网站的性能
响应头
ETag
作用: 和If-None-Match 配合使用。 (实例请看上节中If-None-Match的实例)
例如: ETag: "03f2b33c0bfcc1:0"
Last-Modified:
作用: 用于指示资源的最后修改日期和时间。(实例请看上节的If-Modified-Since的实例)
例如: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT
mongodb没有使用传统的锁或复杂的带回滚的事务,因为它设计的宗旨是轻量,快速及可预见的高性能。
会报错,数据无法保存到数据库中,报错:validation failed
会忽略该字段,不会保存到数据库中,也不会报错
+是至少匹配一个
*是匹配0个或多个字符串
.是查找单个字符,除了换行和行结束符
贪婪匹配是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。
懒惰匹配是匹配尽可能少的字符。例如:
一般?代表尽可能少重复
var str='aabab';
var reg=/a.*b/;
str.match(reg);//['aabab']贪婪匹配
var reg2=/a.*?/;
str.match(reg2);//['aab']懒惰匹配
GET方式提交的数据最多只能是1024字节(1KB),因为GET是通过URL提交数据的,但是http协议并没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节(2k+35),对其他浏览器,理论上没有限制,其限制取决于操作系统的支持。
POST数据没有限制,起限制作用的是后台程序的处理能力,PHP默认post上传大小是2MB。也就是说post方式传送数据最大理论上没有限制,取决于服务器设置和内存大小。
jsonp只能应对get请求,post请求不行
xhr2 IE10以上兼容--就是利用CORS
CORS(跨域资源共享)跨域原理:在服务端的请求头设置:
header('Access-Control-Allow-Origin:http:baidu.com');
header('Access-Control-Allow-Methods:Post,GET');
IE10以上支持
反斜杠\进行转义,在swig中用autoescape:true进行html安全转义,autoescape:'js'进行js安全转义
跨站请求伪造就是攻击者通过用户的浏览器伪造一个链接或页面诱骗用户点击进去,从而获取用户在其他网站比如银行网站的cookie,进而窃取用户信息盗取资金。
防范:
关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于cookie中。
可以在服务器端生成一个随机码,然后放在form表单的隐藏域中,form提交的时候在服务器端检查。比如验证码。
攻击者在论坛之类的网站上发一个恶意链接,诱导用户点击,盗取用户cookie或者注入脚本攻击该网站。
防范措施:过滤用户的输入,只允许输入合法的值,其他一概过滤。或者对标签进行转义
swig支持模板继承,模板复用,还有变量预处理的过滤器,if/for都支持
Express教程多,简单,回调函数也比较符合js程序员的思维。
koa很轻量,用generator避免了回调函数的嵌套,但有很多ES6的语法,学习成本高
nodejs的语法比较适合前端人员。
可以支持多线程,用threads_a_gogo模块,简称TAGG,或者在需要多线程支持的场景中直接用c++的addon来实现。官方支持的多线程模块是linuv库
也可以支持多进程,用cluster模块实现,还有child_process模块
ApacheBench(简称ab)是Apache附带的一个小工具,用于进行HTTP服务器的性能测试,可以同时模拟多个并发请求。
1,用npm模块的memwatch:
当你的堆内存在5个连续的垃圾回收周期内保持持续增长,那么一个内存泄漏事件被派发,可以发现内存泄露了。但不能定位内存泄露实际出现的位置。通过memwatch heap diff可以得到堆内存使用量和内存随程序运行产生的差异。但只能知道泄露来自于闭包,而不知道是哪一个闭包造成了内存泄露。
2,npm模块node-heapdump是一个非凡的模块,它可以将v8引擎的堆内存内容dump出来。你可以在开发工具中对比不同运行阶段的堆内存快照,这样可以帮助定位到内存泄露的位置。
3,process.memoryUsage()可以直接检测内存的增长。
process.heapTotal,process.heapUsed:分别代表v8引擎内存分配和正在使用的大小。
用alinode监控
ajax长轮询:setInterval里处理ajax请求
readyState的5个值:
0:请求未初始化,此时:已经创建了一个XMLHttpRequest对象
1:服务器连接已建立:此时,已经调用了XMLHttpRequest对象的open方法,并且XMLHttpRequest对象已经准备好将一个请求发送到服务器端
2:请求已发送:此时,已经通过send方法把一个请求发送到服务器端,但是还没有收到一个响应
3:正在接收状态:此时,已经接收到HTTP响应头部信息,但是消息体部分还没有完全接收到
4:请求已完成,且响应已就绪:此时,已经完成了HTTP响应的接收
status的2个值:
200:'ok'
404:未找到页面
增加了options方法,它允许客户端获取一个服务器支持的方法列表。
增加了Upgrade头域,通过该头域客户端可以让服务器知道它能够支持的其他备用通信协议,服务器可以据此进行协议切换,使用备用协议与客户端通信。
在1.0的基础上加入了一些cache的新特性,当缓存对象的Age超过Expire时变为stale对象,cahe不需要直接抛弃stale对象,而是与源服务器进行重新激活。
引入了ETag
在请求消息中加入range头域,它允许只请求资源的某个部分。在响应消息中Content-Range头域声明了返回的这部分对象的偏移值和长度。如果服务器相应地返回了对象所请求范围的内容,则响应码为206(部分内容)
新增了状态码100(Continue),客户端事先发送一个只带头域的请求,如果服务器因为权限拒绝了请求,就返回401(未授权)。如果服务器接收此请求就返回响应码100,客户端就可以发送带实体的完整请求了。这样可以避免贸然发出带实体的请求被拒浪费带宽。
http 1.1允许客户端不用等待上一次请求结果返回,就可以发出下次请求,但服务器返回响应还是按照请求的先后顺序的。流水线式的请求可以显著减少整个下载过程所需要的时间。
识别虚拟主机
为了满足互联网使用不同母语和字符集的用户,一些网络资源有不同的语言版本(如中文版、英文版)。
DOS通过大量合法的请求占用大量网络资源,以使服务器瘫痪
1,通过使网络过载来干扰甚至阻断正常的网络通讯
2,通过向服务器提交大量请求,使服务器超负荷
3,阻断某一用户访问服务器
4,阻断某个服务于特定系统或个人的通讯
IP欺骗
IP欺骗攻击是一种黑客通过向服务器发送虚假的包以欺骗服务器的做法。即将包中的源IP地址设为不存在或不合法的值。服务器一旦接受到该包便会返回接受请求包,但实际上这个包永远返回不到源主机。这种做法事服务器必须开启自己的监听端口等待,也就白白浪费了系统资源。