手把手带你写一个 MiniTomcat
郭屹
前 Sun Microsystems Java 研发工程师
1792 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 22 讲
开篇词 (1讲)
手把手带你写一个 MiniTomcat
15
15
1.0x
00:00/00:00
登录|注册

09|有状态的Response:实现Session传递与Keep-alive

你好,我是郭屹。今天我们继续手写 MiniTomcat。
上节课我们已经实现对 URI 里路径的解析,用于适配 GET 请求时,将参数代入请求地址的情况,而且在请求参数中引入了 Cookie 与 Session,为 HTTP 引入状态,存储用户的相关信息。但我也提到了,我们暂未在 Response 返回参数中回写 Session 信息,所以客户端程序没办法接受这个信息,自然也无法再回传给 Server,这是我们接下来要改造的方向。
此外,现在我们对一个 Socket 的管理是这样的:建立一个 Socket,交给 Processor 处理,当 Processor 处理完毕后随即把这个 Socket 关闭。这样也引出一个问题:一个网页的页面上可能有很多模块,每次都需要访问服务器拿到相应资源,导致本可以使用同一个 Socket 解决的问题,却需要创建多个 Socket,这是对资源的浪费,所以这节课我们也来探讨一下用什么技术来解决这个问题。
接下来我们一起来动手实现。

项目结构

这节课我们先只引入了一个工具类 CookieTools,用来处理 Cookie,其余项目结构并没有发生改变,你可以参考我给出的目录。
MiniTomcat
├─ src
│ ├─ main
│ │ ├─ java
│ │ │ ├─ server
│ │ │ │ ├─ CookieTools.java
│ │ │ │ ├─ DefaultHeaders.java
│ │ │ │ ├─ HttpConnector.java
│ │ │ │ ├─ HttpHeader.java
│ │ │ │ ├─ HttpProcessor.java
│ │ │ │ ├─ HttpRequest.java
│ │ │ │ ├─ HttpRequestFacade.java
│ │ │ │ ├─ HttpRequestLine.java
│ │ │ │ ├─ HttpResponse.java
│ │ │ │ ├─ HttpResponseFacade.java
│ │ │ │ ├─ HttpServer.java
│ │ │ │ ├─ Request.java
│ │ │ │ ├─ Response.java
│ │ │ │ ├─ ServletProcessor.java
│ │ │ │ ├─ Session.java
│ │ │ │ ├─ SessionFacade.java
│ │ │ │ ├─ SocketInputStream.java
│ │ │ │ ├─ StatisResourceProcessor.java
│ │ ├─ resources
│ ├─ test
│ │ ├─ java
│ │ │ ├─ test
│ │ │ │ ├─ HelloServlet.java
│ │ │ │ ├─ TestServlet.java
│ │ ├─ resources
├─ webroot
│ ├─ test
│ │ ├─ HelloServlet.class
│ │ ├─ TestServlet.class
│ ├─ hello.txt
├─ pom.xml
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了在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
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部