02 | HTTP协议必知必会
该思维导图由 AI 生成,仅供参考
HTTP 的本质
- 深入了解
- 翻译
- 解释
- 总结
HTTP协议是Web开发中不可或缺的一部分,承担着浏览器与服务器之间的数据传输任务。本文深入探讨了HTTP的本质、工作原理、请求响应实例、Cookie和Session技术以及Tomcat的Session管理。通过对HTTP协议的解析,读者能够了解到HTTP是一种通信格式,而HTML才是通信的目的。此外,文章还介绍了Cookie和Session技术,以解决HTTP协议无状态的问题,保持用户状态。Tomcat作为Web容器,负责创建和管理Session,并提供了多种持久化方案来存储Session,以提升高可用性。在HTTP/1.1中,引入了HTTP长连接的概念,使用长连接的HTTP协议可以提高通信效率。尽管HTTP具有无状态的特点,但通过Cookie和Session技术以及HTTP长连接,可以实现多个请求之间的关联,从而解决了这一矛盾。本文为读者提供了对HTTP协议基本原理和相关技术的快速了解,为进一步学习Web容器打下基础。
《深入拆解 Tomcat & Jetty 》,新⼈⾸单¥68
全部留言(89)
- 最新
- 精选
- 吃饭饭置顶我一直不太理解什么是无状态,restful经常听说是无状态的,是一个概念吗?求解答
作者回复: 我的理解是REST是一种架构风格:将网络上的信息实体看作是资源,可以是图片、文件、一个服务...资源用URI统一标识,URI中没有动词哦,这是因为它是资源的标识,那怎么操作这些资源呢,于是定义一些动作:GET、POST、PUT和DELETE。通过URI+动作来操作一个资源。所谓的无状态说的是,为了完成一个操作,请求里包含了所有信息,你可以理解为服务端不需要保存请求的状态,也就是不需要保存session,没有session的好处是带来了服务端良好的可伸缩性,方便failover,请求被LB转到不同的server实例上没有差别。从这个角度看,正是有了REST架构风格的指导,才有了HTTP的无状态特性,顺便提一下,REST和HTTP1.1出自同一人之手。但是理想是丰满的,现实是骨感的,为了方便开发,大多数复杂的Web应用不得不在服务端保存Session。为了尽量减少Session带来的弊端,往往将Session集中存储到Redis上,而不是直接存储在server实例上..
2019-05-13790 - 阿斯蒂芬Http的无状态我理解是指不同请求间协议内容无相关性,即本次请求与上次请求没有内容的依赖关系,本次响应也只针对本次请求的数据,至于服务器应用程序为用户保存的状态是属于应用层,与协议是无关的。 keep-alive表示tcp的连接可以复用,指的是利用已有的传输通道进行http协议内容的传输,省去创建/关闭连接的开销达到提升性能的效果。应用程序其实一般不关心这次Http请求的TCP传输细节,只关心Http协议的内容,因此只要复用tcp连接时做好必要的数据重置,是不算有状态的。
作者回复: 说的很清楚 👍
2019-05-135179 - 而立斋无状态的协议,使用cookie、session等机制实现有状态的的web。 无状态是指协议对于事务处理没有记忆功能,对同一个url请求没有上下文关系,每次的请求都是独立的,服务器中没有保存客户端的状态。HTTP协议长连接、短连接实质上是TCP协议的长连接、短连接。长连接省去了较多的TCP建立、关闭操作,减少了浪费,节约时间;短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。具体的应用场景采用具体的策略,没有十全十美的选择,只有合适的选择。 那为什么HTTP协议会被设计成无状态的呢?http最初设计成无状态的是因为只是用来浏览静态文件的,无状态协议已经足够,也没什么其他的负担。随着web的发展,它需要变得有状态,但是不是就要修改http协议使之有状态呢?是不需要的。因为我们经常长时间逗留在某一个网页,然后才进入到另一个网页,如果在这两个页面之间维持状态,代价是很高的。其次,历史让http无状态,但是现在对http提出了新的要求,按照软件领域的通常做法是,保留历史经验,在http协议上再加上一层实现我们的目的。所以引入了cookie、session等机制来实现这种有状态的连接。
作者回复: 说的很好很详细👍
2019-05-14373 - yanghttp1.0: 买一个信封只能传送一个来回的信。 http1.1: keep–alive:买一个信封可以重复使用,但前提是得等到服务端把这个信封送回来。
作者回复: 优秀👍
2019-05-13367 - 刘为红sessionid是服务端生成的,服务端通过set-cookie放在http的响应头里,然后浏览器写到cookie里,后续每次请求就会自动带上来了,这点感觉讲得不是很清楚
作者回复: 谢谢指出~
2019-05-14562 - 逍遥哥哥老师,您好,现在的web容器都支持将session存储在第三方中间件(如redis)中,为什么很多公司喜欢绕过容器,直接在应用中将会话数据存入中间件中?
作者回复: 用Web容器的Session方案需要侵入特定的Web容器,用Spring Session可能比较简单,不需要跟特定的Servlet容器打交道。 这正是Spring喜欢做的事情,它使得程序员甚至感觉不到Servlet容器的存在,可以专心开发Web应用。但是Spring到底做了什么,Spring Session是如何实现的,我们还是有必要了解了解~ 其实它是通过Servlet规范中的Filter机制拦截了所有Servlet请求,偷梁换柱,将标准的Servlet请求对象包装了一下,换成它自己的Request包装类对象,这样当程序员通过包装后的Request对象的getSession方法拿Session时,是通过Spring拿Session,没Web容器什么事了。
2019-05-14439 - 微信小助手HTTP的无状态性与共用TCP连接发送多个请求之间没有冲突, 这些请求之间相对独立,唯一的关系可能只有发送的先后顺序关系。 此外,HTTP/1.1中的长连接依然没有解决 head of line blocking 的问题, 后面的连接必须等待前面的返回了才能够发送, 这个问题直到HTTP/2.0采取二进制分帧编码方式才彻底解决。
作者回复: 👍Tomcat和Jetty都支持HTTP2.0了
2019-05-13338 - Geek_28b75e老师,我们经常说的cookie跨域问题中,跨域是什么概念呢
作者回复: cookie有两个重要属性: domain字段 :表示浏览器访问这个域名时才带上这个cookie path字段:表示访问的URL是这个path或者子路径时才带上这个cookie 跨域说的是,我们访问两个不同的域名或路径时,希望带上同一个cookie,跨域的具体实现方式有很多..
2019-05-24232 - Royal您好!上面提到的引入session是因为cookie存在客户端,有安全隐患;但是session id也是通过cookie由客户端发送到服务端,同样有安全隐患啊?
作者回复: 是的,虽然敏感的用户信息没有在网络上传输了,但是攻击者拿到sessionid也可以冒充受害者发送请求,这就是为什么我们需要https,加密后攻击者就拿不到sessionid了,另外CSRF也是一种防止session劫持的方式。
2019-05-13218 - 有所思用token机制呢
作者回复: token比如jwt token本质是个加密的cookie
2019-08-08216