前端面试必问知识点

56 篇文章 3 订阅

HTTP header 有哪些字段&HTTP 的方法有哪些方法

Http中存在多个字段可实现Http功能的扩展,也就是之前所提到的易于扩展特性。

数据类型与编码类型字段
客户端和服务器常常需要协商返回的数据。客户端发送请求时需告知服务器所需返回的文件类型,服务端需告知浏览器实际返回的数据是什么类型。
同样,他们之间也需协商数据的编码类型。
常见数据类型(MIME type)
text
文本类型数据,具体包括纯文本文档(text/plain)、超文本文档(text/html)和样式文档(text/css)等。

image
图片类型数据,具体包含image/jpg、image/png、image/gif等。

audio/video
音频或视频数据,具体有audio/mp3和video/mp4等。

application
表示不确定的数据类型,可能为文本或者二进制文件,具体由应用程序识别,如:application/json、application/javascript等。

常见编码方式(Encoding type)
流行程度从高到低:gzip、deflate、br(专门为HTTP优化的算法)。

数据类型字段
Accept
发送方设置Accept字段,表达所需服务器返回数据的类型。
可选多个数据类型,用逗号隔开,优先级从前往后降低。
例如:
Accept:text/html,application/xml
Content-type
接收方接收到请求后,返回给发送方数据通过Content-type表明返回数据的类型。
接收方根据数据类型做相应处理。
例如:
Content-Type:text/html
编码类型字段
Accept-Encoding
请求方通过Accept-Encoding确定客户端可用的编码方式。
例如:
Accept-Encoding:gzip,deflate,br
Content-Encoding
响应数据在服务器端采取的编码方式。
例如:
Content-Encoding:gzip
语言类型及字符集
语言类型
Http是供全世界使用的,需要应用于各种语言场景,如中文(zh)、英文(en),更加详细的zh-CN、en-GB(英式英语)、en-US(美式英语)。

字符集
用文字编码的方式表示、处理文字。常见的有UTF-8、GBK、ASCII。

语言类型相关字段
Accept-Language
规定客户端可接受的自然语言。
例如:
Accept-Language:zh-CN,en-US
Content-Type
规定响应数据所使用的自然语言。
例如:
Content-Language:zh-CN
字符集相关字段
Accept-Charset
表示客户端可用的字符集。
例如:
Accept-Charset:UTF-8,GBK
Content-Type
没错,还是它,数据类型后可加所用字符集,用分号隔开。
例如:
Content-Type:text/html;charset=utf-8
内容协商
上述多个字段规定了返回数据的类型、编码方式、语言及字符集。字段中有多个可选值时,可设置该值的权重,服务器端进行协商计算以确定最终输出的数据。

设置权值
可以用一个特殊的参数“q”设置具体值的权重,权重从0.01-1,默认值为1。在所要设置值后用分号隔开赋权值。

例如:
Accept:text/html,text/plain;q=0.8

协商结果
上述请求头中的值都可有自己的权值,服务器须根据自身的协商算法,确定最终的返回结果。

Vary字段
响应报文中可设置Vary字段,显示返回的数据参考了哪些请求字段。
例子:
Vary:Accept,Accept-Encoding
重定向跳转字段
状态码部分讲到过,3XX的状态码表示重定向,即第一次请求路径的资源访问不到,须重定向到新的资源路径。

而新的资源路径在Location字段中显示,Location字段只作用于3XX的响应报文中。重定向路径可为绝对路径或相对路径。进行站外跳转时需用绝对路径,进行站内跳转时用相对路径,可根据重定向的上下文补全路径。

示例:
访问的路径是“/18-1”,重定向到“/index.html”。

在这里插入图片描述

CORS跨域

跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器 让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。

只要同时满足以下两大条件,就属于简单请求。
1、请求方法是以下三种方法之一:HEAD、GET、POST
2、HTTP的头信息不超出以下几种字段:Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type

Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

简单请求和非简单请求

只要同时满足以下两大条件,就属于简单请求。
1、请求方法是以下三种方法之一:HEAD、GET、POST
2、HTTP的头信息不超出以下几种字段:Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type

Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

当浏览器发起一个跨域请求的时候会先判断是简单请求还是非简单请求。

对于简单请求,浏览器会先请求,拿到结果后再判断是否跨域。

对于非简单请求,浏览器会先发起一个预检options请求,检查通过之后再发起实际的请求。

简单请求
在请求中需要附加一个额外的 Origin 头部,其中包含请求页面的源信息(协议、域名和端口),以便服务器根据这个头部信息来决定是否给予响应。例如:Origin: http://www.abc.com
如果服务器认为这个请求可以接受,就在Access-Control-Allow-Origin头部中回发相同的源信息(如果是公共资源,可以回发 * )。例如:Access-Control-Allow-Origin:http://www.abc.com
没有这个头部或者有这个头部但源信息不匹配,浏览器就会驳回请求。正常情况下,浏览器会处理请求。注意,请求和响应都不包含 cookie 信息。
如果需要包含 cookie 信息,ajax 请求需要设置 xhr 的属性 withCredentials 为true,服务器需要设置响应头部Access-Control-Allow-Credentials: true。

服务器需要做的工作:
1.设置允许访问本接口的网址
2.设置允许访问本接口的请求类型
3.设置允许访问本接口的头

非简单请求
浏览器在发送真正的请求之前,会先发送一个 Preflight 请求给服务器,这种请求使用 OPTIONS方法,发送下列头部:
Origin:与简单的请求相同。
Access-Control-Request-Method: 请求自身使用的方法。
Access-Control-Request-Headers: (可选)自定义的头部信息,多个头部以逗号分隔。如Content-Type

get请求和post请求的区别

post请求。Tomcat默认2M 打开tomcat目录下的conf目录,打开server.xml 文件,修改maxPostSize=“0”

关于this指向问题

  1. 全局作用域或者普通函数 window
  2. 事件函数内部的this指向事件源:注意在事件函数中如果包含普通函数,普通函数自执行后,内部this还是指向window
  3. 对象方法调用时,this指向调用的对象
  4. 构造函数里面this的指向是实例的对象
  5. 在严格模式下,this是undefined.
  6. 用call、apply、bind的方式调用函数this指向当前绑定的对象

HTTP/1.x keep-alive 与 HTTP/2 多路复用区别

总结一下,HTTP/1.x keep-alive 与 HTTP/2 多路复用区别:

HTTP/1.x 是基于文本的,只能整体去传;HTTP/2 是基于二进制流的,可以分解为独立的帧,交错发送

HTTP/1.x keep-alive 必须按照请求发送的顺序返回响应;HTTP/2 多路复用不按序响应

HTTP/1.x keep-alive 为了解决队头阻塞,将同一个页面的资源分散到不同域名下,开启了多个 TCP 连接;HTTP/2 同域名下所有通信都在单个连接上完成

HTTP/1.x keep-alive 单个 TCP 连接在同一时刻只能处理一个请求(两个请求的生命周期不能重叠);HTTP/2 单个 TCP 同一时刻可以发送多个请求和响应

如果做倒计时精确!!!

首先要知道前端做倒计时存在的问题,无非就是setTimeout 和 setInterval两种定时器,而且重要的是 这两个API是宏任务,当前宏任物的执行依赖于上一次宏任务是否完成,也就是说我们经常写的

setTimeout(()=>{},1000) 

(js是单线程的,容易阻塞)这里的1000只是一个相对值,可以理解成当前定时器最快执行是1s后,并不是说1s后一定执行,如果上下文中存在多个宏任物,该宏任物需等待上一个宏任务执行完毕后再执行!所以会造成误差。

如果消除误差需要知道可以通过服务器来获取准确时间,

服务器准确的时间 = 当前接口请求耗时 + 当前时间

然后去设置定时器!

假如从服务器拿到的 时间为 9000ms

开始定时器

var ms = 9000 //通过接口获取的服务器时间
var time = 1000 
var startTime = new Date().getTime() - 接口请求耗时
var count = 0 //每一秒修正一次定时器误差
	if(ms>0{
		var timerout = setTimeout(fixTime,time)
	}

fixTime(){
count++
var offsetTime  = new Date().getTime() - (startTime+count*1000)
	var nextTime = time - offsetTime
	if(nextTime<0){
		nextTime = 0
	}
	ms-=1000
	if(ms<0){
	// 说明倒计时结束了
	clearTimeout(timerout)
	}else{
	// 修正误差
	timerout = setTimeout(fixTime,nextTime)
	}
}

HTTPS加密过程

为什么要有 https
1.http明文传输(银行卡信息,个人信息容易泄露)
2.http不验证通信双方的身份
3.http无法检验报文的完整性,报文可能被篡改

SSL在传输层加密!!!

为了追求性能(非对称加密速度太慢),还要保证安全,https采用混合加密机制 = 对称加密 + 非对称加密 + 数字证书

客户端持有的服务器的公钥就是 根证书(服务器)用于验证客户端的证书是否合法,是否过期,是否有电子签名。

HTTPS 在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小张很嚣张~

支持一下小老弟吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值