前端面试的经典题第二弹

http缓存的meta标签

HTTP协议中关于缓存的信息头关键字包括Cache-Control(HTTP1.1),Pragma(HTTP1.0),last-Modified,Expires等。

  • Cache-Control
    • no-cache 浏览器和缓存服务器不缓存页面信息
    • private 指示对于单个用户的整个或部分响应消息,不能被共享缓存处理
    • must-revalidate 对于客户机的每次请求,服务器验证缓存是否过时
    • public 浏览器和缓存服务器可以缓存页面信息
    • no-store http信息不被存储在对方的磁盘系统
  • Pragma
    • Pragma
    • no-cache
  • last-modified 只页面的最后生成时间,GMT格式
  • Expire 指的是过期的时间,过了某个时间点后从真正的服务器众获取新的页面信息

1) 打开新窗口 值为private、no-cache、must-revalidate,那么打开新窗口访问时都会重新访问服务器。 而如果指定了max-age值,那么在此值内的时间里就不会重新访问服务器,例如: Cache-control: max-age=5(表示当访问此网页后的5秒内再次访问不会去服务器)
2) 在地址栏回车 值为private或must-revalidate则只有第一次访问时会访问服务器,以后就不再访问。 值为no-cache,那么每次都会访问。 值为max-age,则在过期之前不会重复访问。
3) 按后退按扭 值为private、must-revalidate、max-age,则不会重访问, 值为no-cache,则每次都重复访问
4) 按刷新按扭 无论为何值,都会重复访问。Cache-control值为“no-cache”时,访问此页面不会在Internet临时文件夹留下页面备份。
来自《html头文件设置常用之设置缓存》

跨域CORS的步骤

简单请求

主要是指GET,POST,HEAD三种请求方式。

HTTP头文件不超出下面的方式:

Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
  1. 浏览器端:使用GET或者POST发送的请求,根据你请求的地址,给它附加一个额外的Origin头部,其中包含请求页面的源信息(协议、域名和端口)。这个动作大部分浏览器是自动的,除了IE8,它引用的是XDR。
  2. 服务端:如果认为这个请求接受,就在Access-Control-Allow-Origin头部中回发相同的源信息。

例如:Access-Control-Allow-Origin:http://www.test.com

非简单请求(Preflighted Requests)

它支持GET,POST,HEAD以外事件的方法。

浏览器端会根据你的请求方法添加的头信息自动添加除了Origin外还有下面两个属性。

  • Access-Control-Request-Method 该字段是必须的,用来列出浏览器的CORS请求会用到哪些HTTP方法,上例是PUT
  • Access-Control-Request-Headers 该字段是一个逗号分隔的字符串,指定浏览器CORS请求会额外发送的头信息字段

服务端确认允许跨源请求,需要添加以下字段。

  • Access-Control-Allow-Origin 与简单请求一样,指请求页面源信息,*表示所有站点
  • Access-Control-Allow-Methods 该字段必需,它的值是逗号分隔的一个字符串,表明服务器支持的所有跨域请求的方法
  • Access-Control-Allow-Headers 如果浏览器请求包括Access-Control-Request-Headers字段,则Access-Control-Allow-Headers字段是必需的
  • Access-Control-Allow-Credentials 是否发送凭证
  • Access-Control-Max-Age 缓存多长时间(秒为单位)
response.setContentType("text/html; charset=utf-8");
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "*");
response.addHeader("Access-Control-Max-Age", "100");
response.addHeader("Access-Control-Allow-Headers", "X-Custom-Header,accept, content-type");
response.addHeader("Access-Control-Allow-Credentials", "false");

什么时候触发重绘重排

  • 增加或删除DOM节点
  • 移动页面中的元素
  • 增加或者修改样式
  • 设置display: none;(重排并重绘)或者visibility: hidden(只有重排)
  • 用户改变窗口大小,滚动页面等

怎么减少重绘重排

  • 不要一个一个地单独修改属性,最好通过一个classname来定义这些修改
  • clone节点后大幅度修改它,最后插入节点。或者用DocumentFragment进行修改
  • 不要频繁获取计算后的样式,最好暂存起来而不是直接从DOM上读取
  • 绝对定位的动画不会影响其他dom

参考

  • [H5]浏览器缓存机制
  • AJAX POST&跨域 解决方案 - CORS
  • 也谈谈同源策略和跨域问题

你可能感兴趣的:(前端面试的经典题第二弹)