09|有状态的Response:实现Session传递与Keep-alive
项目结构
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了在MiniTomcat中实现有状态的Response以及Session传递与Keep-alive的技术细节。首先介绍了引入状态的重要性,以及解决多次HTTP访问时资源浪费的问题。随后详细介绍了项目结构和所需的准备工作,包括引入CookieTools类和调整DefaultHeaders和HttpRequest类的代码。重点讨论了如何将Request请求内获取的Cookie与Server生成的Session传入Response返回参数内,实现了有状态的Response。同时,还探讨了在持续连接中服务器不关闭Socket的实现方式,以及采用分块传输数据的方式进行发送传输。文章还对代码进行了相应的调整,实现了在Processor中加上Keep-alive的判断,决定是否关闭Socket。整体而言,本文对于想要深入了解MiniTomcat实现原理的读者具有很高的参考价值。文章还简单探讨了一下Keep-alive和chunked模式,让同一个Socket可以用于多次访问,减少了Socket的连接和关闭。但是实际实现中对这个的支持并不充分,后面也没有用到。文章内容丰富,对于想要深入了解有状态的HTTP连接和MiniTomcat实现原理的读者具有很高的参考价值。
《手把手带你写一个 MiniTomcat》,新⼈⾸单¥59
全部留言(4)
- 最新
- 精选
- HH🐷🐠在补充一点 3、while (keepAlive) 为了保持 socket 存活, 会影响非 keep-alive 的请求, 导致死循环。 这块内容老师是否有好的书籍推荐或者以后有加餐, 这样我们可以进行深一层次的探索。
作者回复: 你可能有点纠结了,我是讲Tomcat原理,所以会提到keep-alive,其实,你现在可以不用深究这个,知道就行,因为现在全部都是keep-alive。想了解http协议,看看《图解http》就挺好,要研究它,看看《http权威指南》
2023-12-29归属地:广东2 - HH🐷🐠老师, 我有几个问题 1、服务器端和客户端双方是否都可以控制 close Connection 和使用 chunked 传输? 2、chunked 应用场景有哪些? 目前想到大文件传输, 在现有代码基础上, 自己动手尝试了客户端传输小量文本数据, 客户端多次使用socket 请求服务端, 但服务端并非收到一次请求就返回一次结果, finishResponse 之后也是无法收到服务端返回的结果, 必须 close Connection 才能收到服务端的请求,并且是多次请求合并返回的结果; 这跟我想的有点不一样, 我想的是这个复用的 socket 然后请求一次就返回一次结果, 然后客户端进行处理, 比如客户端请求一个js、一个 css、一个 html, 是需要 close Connection 之后才能返回吗? 不知道是哪方面想的不对, 还得老师指点。
作者回复: 1,双方都可以控制 2,chunked现在是常用的,http1.1默认就是keep-alive,要表示http完毕或者指定长度或者用chunked。你注意看一下浏览器network返回,应该都是chunked,这个并不是对应于什么特定场合。
2023-12-29归属地:广东2 - peter请教老师几个问题: Q1:Http请求头中的“connection: keep-alive”是谁控制的? 该部分是浏览器填的,浏览器是自动填的吗?在填的时候是否受到了服务器的控制? Q2:静态访问不能返回内容 本课程代码,运行后在浏览器中输入:http://localhost:8080/hello.txt 浏览器上没有任何输出,空白,为什么? Q3:错误的servlet网址也能返回 访问地址:http://localhost:8080/servlet/test.HelloServlet,此网址是不小心敲错了,在ServletProcessor.java中打印出来的servletName就是test.HelloServlet,接下来的代码“servletClass = HttpConnector.loader.loadClass(servletName);”竟然没有报错,代码中只有HelloServlet和TestServlet,并没有test.HelloServlet,为什么loadClass还能成功? 浏览器上显示的内容是“Hello World 你好”,根据此内容推测,应该是用了HelloServlet。但我在HelloServlet的输出中,随便增加字符:"Hello World 111你好123" ,重新编译运行, 但浏览器上显示的还是“Hello World 你好”,为什么? Q4:小问题:HelloServlet.java中也多了一个导包语句。 “import jdk.internal.util.xml.impl.Pair;” 估计和上节课的一样,也是IDE自动导入的,我已注释掉该代码。
作者回复: keep-alive是浏览器给定的,现在已经是默认的了。 test是包名,你看看你的java里面的package。业务程序方面的问题,只有靠你自己慢慢调试了。
2023-12-27归属地:北京 - top啦它后面要手写什么?
作者回复: 听一下你的建议
2023-12-27归属地:上海3