200 请求成功并返回所需资源 301 资源永久重定向,浏览器会缓存资源的新地址 302 资源临时重定向,浏览器不会缓存新的资源地址,每次都会执行一次跳转 400 客户端请求有语法错误 401 未授权的请求 403 服务端收到请求,但是拒绝提供服务 404 资源不存在 500 服务端发生错误 503 服务端无法处理当前请求,可能过段时间会正常
URI(Uniform Resource Identifier)称为统一资源标识符,它有两个主要的子集URL和URN构成。
统一资源定位符(URL),它指定了所标识资源的可用位置和检索机制。URL 不一定是 HTTP URL(http://)
,也可以以ftp://
或smb://
开头,指定用于获取资源的协议。
URL由以下几部分组成
统一资源名称(URN) ,它只是标识了资源的名称,对于资源的可用性和位置是不知道的。格式为urn: <NID> : <NSS>
,其中<NID>
是命名空间标识符,而<NSS>
是命名空间特定字符串。一个常见的例子是书籍的ISBN号
CSRF跨站请求伪造
原理: 已登录的用户在进行form表单提交时,即使跨域了也会自动携带cookie。利用这一点,黑客可以通过邮件发送一个自定义的表单让用户点击,表单提交地址为原网站某个接口地址,进而实现跨站请求。
解决方法: 后端渲染表单时在表单上加一个由算法生成的token,表单提交到后端后,验证这个token,伪造的表单是无法伪造token的。
CORS(Cross-Origin Resource Sharing)跨源资源共享,定义了在访问跨源资源时,浏览器与服务器应该如何沟通。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)
简单请求其实就是传统的表单提交,不会触发预检请求,满足以下两个条件的就是简单请求:
请求方式是GET、POST、HEAD
中的一种
Content-Type是application/x-www-form-urlencoded、multipart/form-data、text/plain
中的一种,并且不能包含自定义头部
不满足上面条件的都是非简单请求,非简单请求在发出前浏览器会先发送预检请求,预检请求头部信息中会额外附加一个origin字段,其中包含请求页面的源信息(协议、域名和端口),以便服务器根据这个头部信息来决定是否给予响应。
服务器通过设置Access-Control-Allow-Origin
头部决定是否响应请求,如果包含请求的源,表示接受请求(如果允许任何源来请求,可以设置为*
),如果中不包含请求的源,浏览器会抛出错误被XMLHttpRequest的onerror回调函数捕获。
预检请求是浏览器在跨域请求资源时,自动发送的options
请求,发送这个请求后,服务器可以决定是否允许这种类型的请求。
默认情况下,跨源请求不提供凭据cookie
,但是通过将withCredentials
属性设置为true,指定某个请求应该发送凭据,
**注意:**如果要发送Cookie
,Access-Control-Allow-Origin
就不能设为*
,必须指定明确的、与请求网页一致的域名,且cookie
遵循同源策略。
CSP(Content-Security-Policy)内容安全策略,主要用于预防常见的Web攻击,通过设置Content-Security-Policy
,控制浏览器可以为该页面获取哪些资源。它就像一个白名单,只有白名单上写的资源才会加载。
**方式一:**在HTTP响应报文中设置Content-Security-Policy
**方式二:**使用meta
标签
缓存是性能优化的重要手段,合理使用缓存,不仅能够节省服务器资源,更能为用户提供好的浏览体验
服务端在返回资源时先基于某种算法计算出资源的唯一值(比如hash),然后设置到ETag里,下次请求时浏览器会自动带上If-None-Match: <ETag-value>
,服务器通过判断Etag值决定是否返回新的资源,过期了的话就返回 200 带上新的内容,否则返回 304,让浏览器拿缓存。
当在地址栏输入url后,发生了什么?资源从请求发出到渲染结束的整个过程如下:
TCP/IP
链接(三次握手)三次握手建立链接:
四次挥手断开链接:
服务器发送完资源后,请求断开链接(发送FIN)
浏览器收到请求后,表示我知道了(此时浏览器可能还没接收完数据,发送ACK)
浏览器接收完数据,表示可以断开了(发送FIN)
服务器端收到请求,表示我断开了(发送ACK)
标准的OSI网络模型是七层,实际使用通常是五层模型。