HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
Web服务器根据接收到的请求后,向客户端发送响应信息。
HTTP默认端口号为80,HTTPS的默认端口为443。
HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力,因此为了保证事物处理,出现了cookie/session,JWT等相关方案。
Accept: application/json 浏览器可以接受服务器回发的类型为 application/json。
一个是请求一个是响应
Accept: application/json
代表客户端希望接受的数据类型是 json 类型
Content-Type: application/json
代表发服务器发送的实体数据的数据类型。
例子:
Accept-Encoding: gzip
Accept-Encoding: compress, gzip // 支持compress 和gzip类型
Accept-Encoding: identity //默认是identity
Accept-Encoding: * // 支持所有类型
Accept-Encoding: compress;q=0.5, gzip;q=1.0 // 按顺序支持 gzip , compress
Accept-Encoding: gzip;q=1.0, identity;q=0.5, *;q=0 // 按顺序支持 gzip,identity 注意哈,是按照q的顺序
Accept-Language:zh-CN,zh;q=0.9 浏览器自己接收的语言,q的作用和上里等同
Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。
请求报头域主要用于指定被请求资源的Internet主机和端口号
当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,这个请求头被用来做防盗链,只有固定域名或IP才可以请求服务器资源,这样别人的一些网站就不能使用我们的资源了,流量都是要收费的;
这个请求头也被骗子用来钓鱼,
比如:你使用csdn打开一个连接的时候,这个连接的referer就是csdn的域名,那么骗子知道你是从什么网站跳转过来的,那骗子就可以做一个和csdn一毛一样的网站的登陆页面来诱导你输入账号密码,大家都知道,你的csdn密码和你的银行卡密码一般都是一样的
User-Agent:Mozilla,告诉HTTP服务器客户端使用的操作系统和浏览器的名称和版本,要是IE,就给他提示IE浏览器用户不配拥有我们的服务。
Cache-Control:no-cache 响应不会被缓存,而是实时向服务器端请求资源。
Cache-Control:max-age=10 设置缓存最大的有效时间,但是这个参数定义的是时间大小(比如:60)而不是确定的时间点。单位是[秒 seconds]。
Cache-Control:no-store 在任何条件下,响应都不会被缓存,并且不会被写入到客户端的磁盘里,这也是基于安全考虑的某些敏感的响应才会使用这个。
Cookie是用来存储一些用户信息以便让服务器辨别用户身份的,cookie可以设置path,cookie生效限制,还可以设置http-only,这样JS就不允许读取cookie了
强制缓存就是之这个,完了之后还有协商缓存,last-modified,e-tag,之类的
Cache-Control:no-cache 浏览器和缓存服务器都不应该缓存页面信息。
Cache-Control:max-age=10 是通知浏览器10秒之内不要烦我,自己从缓冲区中刷新。
Cache-Control:no-store 请求和响应的信息都不应该被存储在对方的磁盘系统中。
Content-Type:text/html;charset=UTF-8 客户端通过utf-8对资源进行解码,和上面Accept一个请求一个响应,注意区分
Content-Encoding:gzip 告诉客户端,服务端发送的资源是采用gzip编码的,客户端看到这个信息后,应该采用gzip对资源进行解码。
Date: Tue, 03 Apr 2020 03:52:28 GMT 这个是服务端发送资源时的服务器时间,GMT是格林尼治所在地的标准时间。http协议中发送的时间都是GMT的,这主要是解决在互联网上,不同时区在相互请求资源的时候,时间混乱问题。
Server:Tengine/1.4.6 这个是服务器和相对应的版本,只是告诉客户端服务器信息。
Expires:Sun, 1 Jan 1994 01:00:00 GMT 这个响应头也是跟缓存有关的,告诉客户端在这个时间前,可以直接访问缓存副本,很显然这个值会存在问题,因为客户端和服务器的时间不一定会都是相同的,如果时间不同就会导致问题。Cache-Control优先级会比这个高
Last-Modified: Dec, 26 Dec 2019 17:30:00 GMT 所请求的对象的最后修改日期,也是用来做缓存的
ETag: “63178e23651f3876876” ETag的作用跟Last-Modified的作用差不多,做缓存的,但是记住,Cache-Control是大哥:强制缓存
Access-Control-Allow-Origin: * 表示所网站的资源之后都可以使用,还可以这样设置
Access-Control-Allow-Origin: www.gh.com 只能加载这个域名下的资源,其他的都不行,这样就可以保证下载的js都来自这个域名下,保证了一定的安全性,还可以对不同类型的协议指定不同的域名,比如image: www.gh.com,blob 这样图片只有这两种连接的图片才能展示
Access-Control-Allow-Methods:GET,POST,PUT,DELETE 允许哪些方法来访问
1XX系列响应代码仅在与HTTP服务器沟通时使用。
2XX系列响应代码表明操作成功了。
3XX系列响应代码表明:客户端需要做些额外工作才能得到所需要的资源。它们通常用于GET请求。他们通常告诉客户端需要向另一个URI发送GET请求,才能得到所需的表示。那个URI就包含在Location响应报头里。
304(“Not Modified”)
资源自某一时间以来一直没有改变过,那么服务器可以返回一个304响应,就不会重复加载资源
这些响应代码表明客户端出现错误。不是认证信息有问题,就是表示格式或HTTP库本身有问题。客户端需要自行改正。
400(“Bad Request”)
这是一个通用的客户端错误状态,当其他4XX响应代码不适用时,就采用400。此响应代码通常用于“服务器收到客户端通过PUT或者POST请求提交的表示,表示的格式正确,但服务器不懂它什么意思”的情况。
404(“Not Found”)
这也许是最广为人知的HTTP响应代码了。404表明服务器无法把客户端请求的URI转换为一个资源。
405(“Method Not Allowd”)
客户端试图使用一个本资源不支持的HTTP方法。例如:一个资源只支持GET方法,但是客户端使用PUT方法访问。
服务器错误
500(“Internal Server Error”)
重要程度:高。
这是一个通用的服务器错误响应。对于大多数web框架,如果在执行请求处理代码时遇到了异常,它们就发送此响应代码。
502(“Bad Gateway”)
只有HTTP代理会发送这个响应代码。它表明代理方面出现问题,或者代理与上行服务器之间出现问题,而不是上行服务器本身有问题。若代理根本无法访问上行服务器,响应代码将是504。
是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,举个例子,你在学校门卫那里登陆了,拿到一个允许出入的条子,当你去学校中的某一栋楼的时候,只要和保安出示这个条子,楼栋的保安就会让你进去,而不用再重复你的账号密码;
所以单系统登录,sso需要一个独立的认证中心,只有认证中心能接受用户的用户名密码等安全信息,其他系统不提供登录入口,只接受认证中心的间接授权。间接授权通过令牌实现,sso认证中心验证用户的用户名密码没问题,创建授权令牌,在接下来的跳转过程中,授权令牌作为参数发送给各个子系统,子系统拿到令牌,即得到了授权,可以借此创建局部会话,局部会话登录方式与单系统的登录方式相同。这个过程,也就是单点登录的原理:
1.用户访问某个应用 www.guohao.com/app1,就会重定向到单点登陆的登陆界面 cas.gghh.com/login
2.重定向的时候会把当前访问界面的URL带上,这样登陆完成之后就可以跳转回去了,比如这样:cas.gghh.com/login?returnUrl=www.guohao.com/app1
3.在地址cas.gghh.com/login?returnUrl=www.guohao.com/app1上完成登陆之后,系统就先会在cas.gghh.com这个域名下set-cookie,把TGT写到cookie中,然后重定向到returnUrl对应的地址上,同时把签发的凭证给带上,也就是cas中所谓的TGT,本公司又叫CTGT,例如这样:www.guohao.com/app1?CTGT=jshfkdhskjfhskdfhskfhweuyriwyershdfg一串HASH
4、重定向到www.guohao.com/app1?CTGT=jshfkdhskjfhskdfhskfhweuyriwyershdfg之后,app1的服务端就会收到这个请求,同时拿到CTGT,拿CTGT再去cas.gghh.com做认证,看看这个CTGT是不是刚刚自己签发给app1的,如果检查了没有问题,那么app1就会通过set-cookie给用户一个cookie,用户就可以正常和app1的服务器通信了;
5、当用户访问app2的时候www.gh.com/app222222222,也会重定向到单点登陆的登陆界面 cas.gghh.com/login,但是这个时候就和第一步不一样了,应为这个时候已经在步骤3中把TGT写到cookie中了,所以访问cas.gghh.com/login的时候是已经有cookie了,这个时候就不会让用户再登陆一次,而是直接重定向到
www.gh.com/app222222222?CTGT=jshfkdhskjfhskdfhskfhweuyriwyershdfg,然重复步骤4,就能访问应用2了;
6、当然,单点登陆不止登陆,还有登出,保活续签,实现单点登陆的方案也不止cas-server一种,比如,在一级域名登陆,cookie在所有二级域名共享的方式也可以实现单点登陆;、
不知道大家有没有发现,上诉例子中的应用1 www.guohao.com/app1 和应用2 www.gh.com/app222222222 和单点登陆 cas.gghh.com/login的域名是不同的,这个就是cas的好处,只需要一个认证中心就可以集成几个不同的应用