Cookie 和 session 都可用来存储用户信息,cookie 存放于客户端,session 存放于服务器端, 因为 cookie 存放于客户端有可能被窃取,所以 cookie 一般用来存放不敏感的信息,比如 用户设置的网站主题,敏感的信息用 session 存储,比如用户的登陆信息,session 可以存放于文件,数据库,内存中都可以,cookie 可以服务器端响应的时候设置,也可以客户端通过 JS 设置 cookie 会在请求时在 http 首部发送给客户端,cookie 一般在客户端有大小限制,一般为 4K。
下面从几个方向区分一下 cookie,localstorage,sessionstorage 的区别
1、生命周期:
2、存放数据:
5、应用场景:
从安全性来说,因为每次 http 请求都回携带 cookie 信息,这样子浪费了带宽,所以 cookie 应该尽可能的少用,此外 cookie 还需要指定作用域,不可以跨域调用,限制很多,但是 用户识别用户登陆来说,cookie还是比storage好用,其他情况下可以用storage,localstorage 可以用来在页面传递参数,sessionstorage 可以用来保存一些临时的数据,防止用户刷新 页面后丢失了一些参数。
name 字段为一个 cookie 的名称。
value 字段为一个 cookie 的值。
domain 字段为可以访问此 cookie 的域名。 非顶级域名,如二级域名或者三级域名,设置的 cookie 的 domain 只能为顶级域名或者二级域名或者三级域名本身,不能设置其他二级域名的 cookie,否则 cookie 无法生成。 顶级域名只能设置 domain 为顶级域名,不能设置为二级域名或者三级域名,否则 cookie无法生成。 二级域名能读取设置了 domain 为顶级域名或者自身的 cookie,不能读取其他二级域名 domain 的 cookie。所以要想 cookie 在多个二级域名中共享,需要设置 domain 为顶级域名,这样就可以在所有二级域名里面或者到这个 cookie 的值了。 顶级域名只能获取到 domain 设置为顶级域名的 cookie,其他 domain 设置为二级域名的无法获取。
path 字段为可以访问此 cookie 的页面路径。 比如 domain 是 abc.com,path 是/test,那么只有/test 路径下的页面可以读取此 cookie。
expires/Max-Age 字段为此 cookie 超时时间。若设置其值为一个时间,那么当到达此时间后,此 cookie 失效。不设置的话默认值是 Session,意思是 cookie 会和 session 一起失效。 当浏览器关闭(不是浏览器标签页,而是整个浏览器) 后,此 cookie 失效。Size 字段 此 cookie 大小。
http字段 cookie的httponly属性。若此属性为true,则只有在http请求头中会带有此cookie的信息,而不能通过 document.cookie 来访问此 cookie。
secure 字段 设置是否只能通过 https 来传递此条 cookie
encodeURI()
2. 视口:广义的视口,是指浏览器显示内容的屏幕区域,狭义的视口包括了布局视口、视觉视口和理想视口。
布局视口定义了pc网页在移动端的默认布局行为,因为通常pc的分辨率较大,布局视口默认为980px。不设置网页的viewport的情况下,pc端的网页默认会以布局视口为基准,在移动端进行展示,导致根植于pc端的网页在移动端展示很模糊。
视觉视口表示浏览器内看到的网站的显示区域,用户可以通过缩放来查看网页的显示内容,从而改变视觉视口。仅仅类似于放大镜中显示的内容,因此不会影响布局视口的宽度和高度。
理想视口或者应该全称为“理想的布局视口”,在移动设备中就是指设备的分辨率。或者说分辨率就是给定设备物理像素的情况下,最佳的“布局视口”。
DPR(Device pixel ratio)设备像素比来表示分辨率和物理像素之间的联系
1 DPR = 物理像素/分辨率
在不缩放的情况下,一个css像素就对应一个DPR
1 CSS像素 = 物理像素/分辨率(条件:不缩放)
在移动端的布局中,可以通过viewport元标签来控制布局
<meta id="viewport" name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1; user-scalable=no;">
| 属性名 | 取值 | 描述 |
|---|---|---|
| width | 正整数 | 定义布局视口的宽度,单位为像素 |
| height | 正整数 | 定义布局视口的高度,单位为像素,很少使用 |
| initial-scale | [0,10] | 初始缩放比例,1表示不缩放 |
| minimum-scale | [0,10] | 最小缩放比例 |
| maximum-scale | [0,10] | 最大缩放比例 |
| user-scalable | yes/no | 是否允许手动缩放页面,默认值为yes |
解决思路:在移动端布局时,device-width一般是表示分辨率的宽。在meta标签中会将width设置称为device-width,通过width=device-width的设置就将布局视口设置成了理想的视口。
3.px与自适应
在pc端的布局视口通常情况下为980px,移动端以iphone6为例,分辨率为375 * 667。现在有一个750px * 1134px的视口稿
PC端: 1 CSS像素 = 物理像素/分辨率 = 750 / 980 =0.76 px
iphone6:1 CSS像素 = 物理像素 /分辨率 = 750 / 375 = 2 px
意味着在PC端,一个css像素可以用0.76个物理像素来表示,而iphone6中 一个CSS像素表示了2个物理像素。无法通过一套样式,实现各端的自适应。
4.媒体查询
@media媒体查询可以针对不同的媒体类型定义不同的样式,特别是响应式页面,可以针对不同屏幕的大小,编写多套样式,从而达到自适应的效果。例如以下代码:分别对分辨率在0~320px,320px~550px,550px~768px以及768px~960px的屏幕设置了不同的背景颜色。
- @media screen and (max-width: 960px){
- body{
- background-color:#FF6699
- }
- }
-
- @media screen and (max-width: 768px){
- body{
- background-color:#00FF66;
- }
- }
-
- @media screen and (max-width: 550px){
- body{
- background-color:#6633FF;
- }
- }
-
- @media screen and (max-width: 320px){
- body{
- background-color:#FFFF00;
- }
- }
5.设置百分比
通过百分比单位 " % " 来实现响应式的效果。当浏览器的宽度或者高度发生变化时,通过百分比单位,使得浏览器中的组件的宽和高随着浏览器的变化而变化,从而实现响应式的效果。
css中的子元素中的百分比(%)是相对于谁的百分比?、
缺点:百分比单位容易使布局问题变得复杂
6.自适应场景下的rem解决方案
rem单位只相对于浏览器的根元素(HTML元素)的font-size。默认情况下,html元素的font-size为16px。
1 rem = 16px
10px/16px=0.625
所以,可以将html的font-size设置为:
html{ font-size: 62.5% }
使得rem转为px变得容易计算。
1 rem = 10px
通过rem来实现响应式布局
由于rem单位都是相对于根元素html的font-size来决定大小的,当页面的size发生变化时,只需要改变font-size的值,那么以rem为固定单位的元素的大小也会发生响应的变化。
因此,如果通过rem来实现响应式的布局,只需要根据视图容器的大小,动态的改变font-size即可。
- function refreshRem() {
- var docEl = doc.documentElement;
- var width = docEl.getBoundingClientRect().width;
- var rem = width / 10;
- docEl.style.fontSize = rem + 'px';
- flexible.rem = win.rem = rem;
- }
- win.addEventListener('resize', refreshRem);
rem布局的缺点:在响应式布局中,必须通过js来动态控制根元素font-size的大小。
也就是说css样式和js代码有一定的耦合性。且必须将改变font-size的代码放在css样式之前。
7.通过vw/vh来实现自适应
css3中引入了一个新的单位vw/vh,与视图窗口有关,vw表示相对于视图窗口的宽度,vh表示相对于视图窗口高度。
| 单位 | 含义 |
|---|---|
| vw | 相对于视窗的宽度,视窗宽度是100vw |
| vh | 相对于视窗的高度,视窗高度是100vh |
| vmin | vw和vh中的较小值 |
| vmax | vw和vh中的较大值 |
视窗宽高都是100vw/100vh,那么vw或者vh,下简称vw,很类似百分比单位。vw和%的区别为:
| 单位 | 含义 |
|---|---|
| % | 大部分相对于祖先元素,也有相对于自身的情况比如(border-radius、translate等) |
| vw/vh | 相对于视窗的尺寸 |
vm单位换算:
对于iphone6/7 375*667的分辨率,那么px可以通过如下方式换算成vw
1px = (1/375)*100 vw
缺点:绝大多数的浏览器支持vw单位,但是ie9-11不支持vmin和vmax(很少用),vw单位在绝大部分高版本浏览器内的支持性很好。但是opera浏览器整体不支持vw单位,因此需选择其他方案。
304:如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个 304 状态码。
|
获取资源形式
| 状态码 |
发送请求到服务器
| |
|
强缓存
|
从缓存取
|
200(from cache)
|
否,直接从缓存取
|
|
协商缓存
|
从缓存取
|
304(not modified)
|
是,通过服务器来告知缓存是否可用
|
强缓存相关字段有 expires,cache-control。如果 cache-control 与 expires 同时存在的话,
cache-control 的优先级高于 expires。
协商缓存相关字段有 Last-Modified/If-Modified-Since,Etag/If-None-Match
因为服务器上的资源不是一直固定不变的,大多数情况下它会更新,这个时候如果我们 还访问本地缓存,那么对用户来说,那就相当于资源没有更新,用户看到的还是旧的资 源;所以我们希望服务器上的资源更新了浏览器就请求新的资源,没有更新就使用本地 的缓存,以最大程度的减少因网络请求而产生的资源浪费。
缓存分为两种:强缓存和协商缓存,根据响应的 header 内容来决定。
>>了解知识点:
重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向)
1)网站调整(如改变网页目录结构);
2)网页被移到一个新地址;
3)网页扩展名改变(如应用需要把.php改成.Html或.shtml)。
这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。
>>301和302状态码的共同点和不同点
>>使用301和302跳转的场景:
使用301跳转的场景:
使用302跳转的场景:
使用302跳转的场景为什么要尽量要使用301跳转?
——网址劫持!
从网址A 做一个302 重定向到网址B 时,主机服务器的隐含意思是网址A 随时有可能改主意,重新显示本身的内容或转向其他的地方。大部分的搜索引擎在大部分情况下,当收到302 重定向时,一般只要去抓取目标网址就可以了,也就是说网址B。如果搜索引擎在遇到302 转向时,百分之百的都抓取目标网址B 的话,就不用担心网址URL 劫持了。问题就在于,有的时候搜索引擎,尤其是Google,并不能总是抓取目标网址。比如说,有的时候A 网址很短,但是它做了一个302 重定向到B 网址,而B 网址是一个很长的乱七八糟的URL 网址,甚至还有可能包含一些问号之类的参数。很自然的,A 网址更加用户友好,而B 网址既难看,又不用户友好。这时Google 很有可能会仍然显示网址A。由于搜索引擎排名算法只是程序而不是人,在遇到302 重定向的时候,并不能像人一样的去准确判定哪一个网址更适当,这就造成了网址URL 劫持的可能性。也就是说,一个不道德的人在他自己的网址A 做一个302 重定向到你的网址B,出于某种原因, Google 搜索结果所显示的仍然是网址A,但是所用的网页内容却是你的网址B 上的内容,这种情况就叫做网址URL 劫持。你辛辛苦苦所写的内容就这样被别人偷走了。302 重定向所造成的网址URL 劫持现象,已经存在一段时间了。不过到目前为止,似乎也没有什么更好的解决方法。在正在进行的谷歌大爸爸数据中心转换中,302 重定向问题也是要被解决的目标之一。从一些搜索结果来看,网址劫持现象有所改善,但是并没有完全解决。
301跳转告诉查找引擎,这个地址弃用了,永远转向一个新地址,可以转移新域名的权重。而302重定向很容易被搜索引擎误认为是利用多个域名指向同一网站,导致你的网站就被封掉,原因是“利用重复的内容来干扰Google搜索结果的网站排名”。
- <style>
- .box {
- width: 0;
- height: 0;
- border: 100px solid transparent;
- border-left-color: red;
- border-right-color: green;
- border-top-color: blue;
- border-bottom-color: yellow;
- }
- style>
- <body>
- <div class="box">div>
-
- body>

- <style>
- /* div {
- width: 0px;
- height: 0px;
- border-top: 10px solid red;
- border-right: 10px solid transparent;
- border-bottom: 10px solid transparent;
- border-left: 10px solid transparent;
- } */
- div {
- width: 0px;
- height: 0px;
- border: 10px solid transparent;
- border-top-color: green;
- }
- style>
-
- <body>
- <div>div>
- body>
首先 html5 为了更好的实践 web 语义化,增加了 header,footer,nav,aside,section 等语义化标签,在表单方面,为了增强表单,为 input 增加了 color,emial,data ,range 等类型,在存储方面,提供了 sessionStorage,localStorage,和离线存储,通过这些存储方式方便数据在客户端的存储和获取,在多媒体方面规定了音频和视频元素 audio 和 vedio,另外还有地理定位,canvas 画布,拖放,多线程编程的 web worker 和 websocket 协议。
输入 url 后,首先需要找到这个 url 域名的服务器 ip,为了寻找这个 ip,浏览器首先会寻找缓存,查看缓存中是否有记录,缓存的查找记录为:浏览器缓存-》系统缓存-》路由器缓存,缓存中没有则查找系统的 hosts 文件中是否有记录,如果没有则查询 DNS 服务器,得到服务器的 ip 地址后,浏览器根据这个 ip 以及相应的端口号,构造一个 http 请求,这个请求报文会包括这次请求的信息,主要是请求方法,请求说明和请求附带的数据,并将这个 http 请求封装在一个 tcp 包中,这个 tcp 包会依次经过传输层,网络层,数据链路层,物理层到达服务器,服务器解析这个请求来作出响应,返回相应的 html 给浏览器,因为 html 是一个树形结构,浏览器根据这个 html 来构建 DOM 树,在 dom 树的构建过程中如果遇到 JS 脚本和外部 JS 连接,则会停止构建 DOM 树来执行和下载相应的代码,这会造成阻塞,这就是为什么推荐 JS 代码应该放在 html 代码的后面,之后根据外部样式,内部样式,内联样式构建一个 CSS 对象模型树 CSSOM 树,构建完成后和 DOM 树合并为渲染树,这里主要做的是排除非视觉节点,比如 script,meta 标签和排除 display 为 none 的节点,之后进行布局,布局主要是确定各个元素的位置和尺寸,之后是渲染页面,因为 html 文件中会含有图片,视频,音频等资源,在解析 DOM 的过程中,遇到这些都会进行并行下载,浏览器对每个域的并行下载数量有一定的限制,一般是 4-6 个,当然在这些所有的请求中我们还需要关注的就是缓存,缓存一般通过 Cache-Control、Last-Modify、Expires 等首部字段控制。 Cache-Control 和 Expires 的区别 在于 Cache-Control 使用相对时间,Expires 使用的是基于服务器 端的绝对时间,因为存在时差问题,一般采用 Cache-Control,在请求这些有设置了缓存的数据时,会先 查看是否过期,如果没有过期则直接使用本地缓存,过期则请求并在服务器校验文件是否修改,如果上一次 响应设置了 ETag 值会在这次请求的时候作为 If-None-Match 的值交给服务器校验,如果一致,继续校验 Last-Modified,没有设置 ETag 则直接验证 Last-Modified,再决定是否返回 304。
常见的 HTTP 的头部
可以将 http 首部分为通用首部,请求首部,响应首部,实体首部
cache-control 是一个通用消息头字段被用于 HTTP 请求和响应中,通过指定指令来实现缓存机制,这个缓存指令是单向的,常见的取值有 private、no-cache、max-age、must-revalidate 等,默认为 private。
构造两棵树,DOM 树和 CSSOM 规则树, 当浏览器接收到服务器相应来的 HTML 文档后,会遍历文档节点,生成 DOM 树, CSSOM 规则树由浏览器解析 CSS 文件生成。
检测页面加载时间一般有两种方式,一种是被动去测:就是在被检测的页面置入脚本或 探针,当用户访问网页时,探针自动采集数据并传回数据库进行分析,另一种主动监测 的方式,即主动的搭建分布式受控环境,模拟用户发起页面访问请求,主动采集性能数 据并分析,在检测的精准度上,专业的第三方工具效果更佳,比如说性能极客。
HTTP 是一个基于 TCP/IP 通信协议来传递数据(HTML 文件, 图片文件, 查询结果等) HTTP 是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于 1990 年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在 WWW 中使用的是 HTTP/1.0 的第六版,HTTP/1.1 的规范化工作正在进行之中,而且 HTTP-NG(Next Generation of HTTP)的建议已经提出。HTTP 协议工作于客户端-服务端架构为上。浏览器作为 HTTP 客户端通过 URL 向 HTTP 服务端即 WEB 服务器发送所有请求。Web 服务器根据接收到的请求后,向客户端发送响应信息。
XSS 防御的总体思路是:对输入(和 URL 参数)进行过滤,对输出进行编码。也就是对提交的所有内容进行过滤,对 url 中的参数进行过滤,过滤掉会导致脚本执行的相关内容; 然后对动态输出到页面的内容进行 html 编码,使脚本无法在浏览器中执行。虽然对输入过滤可以被绕过,但是也还是会拦截很大一部分的 XSS 攻击。
防御 CSRF 攻击主要有三种策略:验证 HTTP Referer 字段;在请求地址中添加 token 并验证;在 HTTP 头中自定义属性并验证。