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

08|解析参数:通过引入Cookie和Session避免反复登录

你好,我是郭屹。今天我们继续手写 MiniTomcat。
上一节课我们完成了对 Request、Response 的 Header 信息解析,并且采用 Facade 模式封装了我们希望暴露给外界的方法体,避免被业务程序员直接调用实现类的内部方法。
在实际的请求结构中,除了消息头部的参数之外,请求的 URI 后缀往往会带上请求参数,例如 /app1/servlet1?username=Tommy&docid=TS0001,路径和参数之间用“?”分隔,参数与参数之间使用“&”隔开,这是我们这节课需要解析的部分。
除此之外,Header 中可能还会包含用户信息,使用 Cookie 存储,但用户信息使用明文传递也不大好,而且 Cookie 是存储在客户端的,为了优化这个问题,Servlet 规范规定了 Session 的用途,这节课我们也会解析并设置 Cookie 和 Session。
下面我们一起动手来实现。

项目结构

这节课我们新增 Session 类,并对其进行封装而定义 SessionFacade 类。同时会增加 TestServlet 类,以便更好地测试。pom.xml 依赖并未发生任何变化。项目结构如下:
MiniTomcat
├─ src
│ ├─ main
│ │ ├─ java
│ │ │ ├─ server
│ │ │ │ ├─ 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
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了如何解析参数以及使用Cookie和Session来存储和传递用户信息。通过手写MiniTomcat的示例,作者讲解了引入Cookie和Session以避免反复登录的方法。文章涵盖了项目结构调整、新增Session类、SessionFacade类的封装定义以及TestServlet类的增加。此外,还介绍了如何处理GET和POST请求中的参数,以及对POST方法的简单处理。通过本文,读者可以了解如何在项目中引入Cookie和Session,提高用户体验和安全性。文章内容涵盖了请求参数的解析、Cookie和Session的使用,以及对不同请求方法的参数处理。对于想要深入了解Web开发和服务器端技术的读者来说,是一篇值得阅读的技术文章。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一个 MiniTomcat》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(3)

  • 最新
  • 精选
  • ctt
    GET /path/to/resource HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br Cookie: sessionid=abc123; username=ctt Connection: keep-alive

    作者回复: 你这个很好!特别是一个key有多行值。

    2023-12-27归属地:广东
  • peter
    请教老师几个问题: Q1:Cookie和Session是成对出现的吗? 有Cookie就一定有Session,对吗?反过来,有Session也一定有Cookie,对吗? Q2:Session的Set-Cookie字段可以出现多次吗? 我让chatGPT3.5给出一个包含Cookie的Http响应,给出的例子是: HTTP/1.1 200 OK Date: Tue, 15 Nov 2022 08:12:31 GMT Server: Apache/2.4.38 (Unix) Set-Cookie: sessionid=abc123; Expires=Wed, 16 Nov 2022 08:12:31 GMT; Path=/ Set-Cookie: username=johndoe; Expires=Wed, 16 Nov 2022 08:12:31 GMT; Path=/ Content-Type: text/html; charset=utf-8 Content-Length: 1234 其中,Set-Cookie出现了两次。 我问gpt为什么出现两次,gpt回答“常抱歉,我犯了一个错误。在HTTP响应中,Set-Cookie首部字段只能出现一次”,但给出的修正后的例子还是包含两个。 请问:Http Response的Set-Cookie字段可以出现多次吗? Q3:本课代码,messaging包不存在 HttpRequest.java文件中有如下导包语句: import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.InternetHeaders; 编译报错: Error:(3, 67) java: 程序包com.sun.xml.internal.messaging.saaj.packaging.mime.internet不存在 前面几课的代码,Idea中修改java版本后都能正常运行,第8课的代码却有这个编译错误,为什么?

    作者回复: 感谢Peter指正问题。 Q1:Cookie和session不是成对的,两者没有必然关联,只是我们用Cookie记录sessionid,也可以在uri中带上jsessionid。 Q2:set-cookie可以重复,后面的会覆盖前面的。 Q3:这个import是有问题,感谢感谢。我原本的代码中没有这个,但是助手从我的Github上搬到Gitee的时候,他先在本地环境中保存了一下代码,被他的IDE自带的coretto jdk自动加上了。我们很快改正,感谢感谢。你自己删除这一行就行。

    2023-12-25归属地:北京
  • HH🐷🐠
    1、手工写一个请求串 POST /servlet/test.TestServlet HTTP/1.1 Host: localhost:8080 Content-Type: application/x-www-form-urlencoded Cookie: jsessionid=43C65BC81B4B4DE4623CD48A13E7FF84; userId=123 Content-Length: 9 name=haha 2、回传 jsessionid 到客户端其实文中也有提到了, 通过 cookie 或 URL 重写进行进行回传。

    作者回复: 正确的。不过你的头中没有一个头的值包含多行的情况,http协议是允许多行的。

    2023-12-25归属地:广东
    2
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部