点击上方 java项目开发,选择 设为星标javascript
优质项目,及时送达html
-----前端
Http 协议基础
经典五层模型
应用层——传输层——网络层——数据链路层——物理层vue
物理层主要做用是定义物理设备如何传输数据,指代物理硬件java
数据链路层在通讯的实体间创建数据链路链接,基本计算机二进制传输react
网络层为数据在节点之间传输建立逻辑链路web
传输层为 TCP 或 UDP,能够想象为一条管道spring
应用层为 HTTP,能够想象为一个包数据库
基本概念:一个 tcp 能够发送多个 http 请求,一个 http 请求必须在一个 tcp 链接里json
http 发展历史
http/0.9
只有一个命令 GET
没有 HEADER 等描述数据的信息
服务器发送完毕,就关闭 TCP 链接
http/1.0
增长了不少命令,POST,PUT
增长了 status code 和 header
多字符集支持、多部分发送、权限、缓存等
http/1.1
支持了持久链接
pipeline,管道化
增长 host 和其余一些命令
http2
全部数据以二进制传输,摆脱原来的字符串
同一个链接里面发送多个请求再也不须要按照顺序来,并行
头信息压缩以及推送等提升效率的功能,服务端能够主动发送信息,提高性能
三次握手
http 不存在链接,只有请求和响应TCP 链接能够发送多个 http 请求,TCP 链接有三次握手网络请求的消耗
客户端发送链接数据包
服务端开启 TCP SOCKET,再给客户端发送数据包
客户端拿到数据包,再给服务端发送确认数据包
第三次是为了不第二次握手丢失,致使服务端一直开启端口链接
URI——URL 和 URN
URI
统一资源标志符/Uniform Resource Identifier
用来惟一标识互联网上的信息资源
包括 URL 和 URN
URL
统一资源定位器/Uniform Resource Locator
http://user:pass@host.com:80/path?query=string#hash
http 协议
user:pass 用户认证,基本用不到
host.com 定位服务在互联网上的位子,能够为 IP 或者域名
80 端口,web 服务,物理服务器上多个 web 服务,不带端口默认访问 80
path 路由,web 服务上具体的内容
query 搜索参数,如何进行搜索和查找,传参
hash 锚点定位工具
此类格式的都叫作 URL,好比 http,ftp 协议
URN
永久统一资源定位符
在资源移动以后还能被找到
目前尚未很是成熟的使用方案
http 报文格式
起始行
请求报文:GET /text/test.txt HTTP/1.0
响应报文:HTTP/1.0 200 OK
头部
请求头:Accept:text/* Accept-Language:en,fr
响应头:Content-type:text/plain Content-length:19
主体
请求体:参数
响应体:返回的数据
HTTP 的方法
用来定义对于资源的操做
经常使用有 GET,POST 等
从定义上讲有各自的语义
HTTP CODE
定义服务器对请求的处理结果
各个区间的 CODE 有各自的语义
100-199 还须要一些操做才能发送请求
200-299 操做成功
300-399 重定向
400-499 发送的请求有问题 401 认证 403 被拒绝 404 找不到
500-599 服务端问题
好的 HTTP 服务能够经过 CODE 判断结果
建立一个简单的 web 服务
const http = require("http");http .createServer(function(req, res) { console.log("req come", req.url);
res.end("123"); }) .listen(9999);
HTTP 各类特性
CORS 跨域请求的限制与解决
浏览器对于非同域的请求会拦截,请求仍是会发送,后台服务返回内容,可是浏览器会拦截掉并报错
简单请求
容许方法仅为 GET,HEAD,POST
Content-Type 仅为 text/plain,multipart/form-data,application/x-www-form-urlencoded
请求头限制,仅部分固定请求头容许
XMLHttpRequestUpload 对象均没有注册任何事件监听器
请求中没有使用 ReadableStream 对象
res.writeHead(200, { "Access-Control-Allow-Origin": "*"});
预请求
先经过 OPTION 请求访问服务端,返回告诉浏览器容许接下来发送的 POST 请求,浏览器就不会拦截
res.writeHead(200, { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "", //容许的请求头 "Access-Control-Allow-Methods": "", //容许的请求方法 "Access-Control-Max-Age": "" //预请求不需option验证的最大时间});
jsonp
<script src="http://127.0.0.1:8888" />
Cache-Control
public 任何地方均可以进行缓存
private 只有发起请求的浏览器进行缓存
no-cache 本地能够存缓存,但须要后台验证事后才能使用
max-age 秒数,缓存存在的最大时间
s-maxage 秒数,在代理服务器,会代替 max-age
max-stale 秒数,发起请求主动带的头的到期时间
must-revalidate 从新验证
proxy-revalidate 用在缓存服务器上,必须从新验证
no-store 不存储缓存
no-transform 用在代理服务器,不改动返回内容
http .createServer(function(req, res) { res.writeHead(200, { "Content-Type": "text/javascript", "Cache-Control": "max-age=20" //会取缓存的内容,请求不会发送到服务器 }); res.end("123"); }) .listen(9999);
通常缓存会是一个比较长的时间,这就致使服务端更新内容,客户端却仍是取老的静态资源。如今经常使用的方法是每次打包时在静态路径上添加一个 hash 码,hash 码根据文件改变而来,这样浏览器访问静态资源时就会重新请求。
缓存验证 Last-Modified 和 Etag 的使用
有 Cache-Control 的状况下
验证头
Last-Modified上次修改时间,给资源设置上一次什么时候修改配合 if-Modified-Since 或者 if-Unmodified-Since 使用对比上次修改时间判断是否须要更新
Etag数据签名,数据惟一标识,数据修改,那么签名会不同配合 if-Match 或者 If-Non-Match 使用对比资源的签名判断是否使用缓存
//服务端进行etag的验证const etag=req.headers['if-none-match']if(etag==='777'){ res.writeHead(304,{ 'Cache-Control':'max-age=200000,no-cache', 'Last-Modified':'123' 'Etag':'777' }) res.end('')}) else { res.writeHead(200,{ 'Cache-Control':'max-age=200000,no-cache', 'Last-Modified':'123' 'Etag':'777' }) res.end('123')}
Cookie 和 Session
Cookie
在服务端返回数据时,经过 Set-Cookie 保存在浏览器,浏览器下次在同域的请求中会在头带上 Cookie,
经过 Set-Cookie 设置
下次请求会自动带上
键值对,能够设置多个
max-age 和 expires 设置过时时间
Secure 只在 https 的时候发送
HttpOnly 没法经过 document.cookie 访问
const host = req.headers.hostconst html=fs.readFileSync('test.html'.'utf8')if (host === "test.com") { res.writeHead(200, { "Set-Cookie": ["id=123;max-age=2", "abc=456;HttpOnly;domain=test.com"] //此时test.com下的全部二级域名均可以访问到cookie })}res.end('html')
Session
常常作法是将保存在 session 中的用户惟一 ID 存入 Cookie,下次请求时拿到 Cookie,经过 Cookie 在 Session 拿到用户信息,进行操做。
Http 长链接
http1.1 默认是长链接, 是在 tcp 上顺序发送请求,浏览器 tcp 并发限制为 6,就是同时能够存在 6 个链接。因此浏览器加载首页时,先建立 6 个 TCP 链接,而后 http 是在这六个链接中顺序发送的。
数据协商
客户端在发送请求时,限定须要拿到的数据格式,内容等。服务端根据这些限制来操做,服务端不必定按照规定返回。请求
Accept 想要的数据类型
Accept-Encoding 数据编码方式进行传输,限制服务器对数据的压缩方式
Accept-Language 但愿展现的语言
User-Agent 浏览器的相关信息返回
Content-Type 实际返回的数据格式
Content-Encoding 对应 Accept-Encoding,声明传输方式
Content-Language 返回的语言
重定向
经过 URL 访问资源时,服务器告诉浏览器资源换位子了,并告诉新的位置,浏览器再请求新的位置,301 永久变动,302 暂时变动,301 的返回会在缓存中提取
if (req.url === "/old") { res.writeHead(302, { Location: "/new" }); res.end("");}if (req.url === "/new") { res.writeHead(200, {}); res.end("1234");}
Content-Security-Policy
内容安全策略
限制资源获取
报告资源获取越权
default-src 限制全局
指定资源类型
res.writeHead(200, { //仅容许http和https "Content-Security-Policy": "default-src http:https:", //仅容许本站脚本 "Content-Security-Policy": "default-src 'self'", //限制特定类型 "Content-Security-Policy": "script-src http:https:" //汇报 "Content-Security-Policy": "script-src ; report-uri /report"})res.end("123")
推荐案例
温暖提示

请长按识别二维码
想学习更多的java功能案例请关注
Java项目开发


若是你以为这个案例以及咱们的分享思路不错,对你有帮助,请分享给身边更多须要学习的朋友。别忘了《留言+点在看》给做者一个鼓励哦!
本文分享自微信公众号 - web项目开发(javawebkaifa)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。