Cookie(搭配domain)/Session(搭配HttpServletRequest+HttpSession)
各位看官,大家早安午安晚安呀~~~
如果您觉得这篇文章对您有帮助的话
欢迎您一键三连,小编尽全力做到更好
欢迎您分享给更多人哦
今天我们来学习:Cookie/Session
1.Cookie/Session的简述
我们在讲解HTTP协议的时候已经讲解过Cookie了
HTTP 协议自身是属于 "无状态" 协议.
"无状态" 的含义指的是:
默认情况下 HTTP 协议的客户端和服务器之间的这次通信, 和下次通信之间没有直接的联系(不幂等).
但是实际开发中, 我们很多时候是需要知道请求之间的关联关系的.
例如登陆网站成功后, 第⼆次访问的时候服务器就能知道该请求是否是已经登陆过了(不然我每次登录软件,都要输入账户密码真的是太费劲了)
1.1回顾 Cookie
Cookie:浏览器在本地存储数据的一种方式。
现代浏览器设计时,会避免网页直接访问计算机的文件系统,因此,浏览器封装了操作文件的API,浏览器作为中间层,管理所有Cookie的读写操作。网页不能直接访问文件系统。
上述的令牌(SessionID)就通常存放在Cookie中
我们每一次访问服务器的时候就要带上Cookie(不管服务器要不要都会带上)
1.2.理解Session
Session:Session 是服务器端保存用户信息的⼀种机制.
也可以这么说:Session是服务器为了保存用户信息而创建的⼀个特殊的对象(本质上就是一个哈希表)
服务器同⼀时刻收到的请求是很多的. 服务器需要清楚的区分每个请求是从属于哪个用户, 也就是属于哪个会话, 就需要在服务器这边记录每个会话以及与用户的信息的对应关系.

1.3.Cookie和Session的区别
- Cookie 是客户端保存用户信息的⼀种机制.
- Session 是服务器端保存用户信息的⼀种机制.
- Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁。
- Cookie 和 Session 经常会在一起配合使用. 但是不是必须配合。Session 中的sessionId 也不需要非得通过 Cookie/Set-Cookie 传递, 比如通过URL传递.
1.4.domain
在 HTTP Cookie 中,domain 是一个非常重要的属性,它决定了 Cookie 的作用域,即哪些域名可以访问这个 Cookie。通过设置 domain
,你可以控制 Cookie 在哪些域名下生效。
譬如你给这个Cookie的domian是:127.0.0.1那么这个Cookie就只能在127.0.0.1(自己主机)下生效
直接理解:这个domain就是一个域名(给一个Cookie设置上这个域名(domain),这个Cookie就只能在这个域名下生效))
1.5.Cookie各个字段的解析

ID=20
- 含义:这是 Cookie 的核心数据,由键值对组成(
ID
是名称,20
是值)。- 作用:通常用于标识用户会话(如登录状态、用户 ID)或存储自定义数据,具体含义由网站后台逻辑决定。
Path=/
- 含义:指定 Cookie 的有效路径。
/
表示根路径,即该 Cookie 对网站所有路径(如/page1
、/api/data
)均有效。- 示例:若设置为
Path=/admin
,则 Cookie 仅在访问https://example.com/admin
及子路径时生效。Expires=Sat, 04 Jul 2026 07:05:02 GMT
- 含义:Cookie 的过期时间(GMT 格式)。若未设置该字段,Cookie 会在浏览器关闭时过期(会话级 Cookie)。
- 作用:控制 Cookie 的存储时长,超过时间后浏览器会自动删除。
其他常见字段(可能未显示但重要)
- Domain:你设置的
127.0.0.1
即为此字段,下文详细说明。- Secure:若存在,说明 Cookie 仅在 HTTPS 连接下有效。
- HttpOnly:防止 JavaScript 读取 Cookie,提升安全性
domain具体解析:
Domain 定义
- 本质:指定 Cookie 允许发送的目标域名或 IP 地址。
- 示例:
- 若设置为
Domain=example.com
,Cookie 会在访问example.com
及其子域名(如sub.example.com
)时发送。- 你设置的
127.0.0.1
是本地回环地址,代表仅对当前主机(本地开发环境)有效。2. Domain 匹配规则(本质就是域名和路径匹配的 (或则子域名)时,才能访问到这个cookie)
- 严格匹配:Cookie 仅在请求域名与
Domain
完全一致或为其子域名时发送。
- 例如:
Domain=127.0.0.1
不会在请求localhost
时发送(尽管两者可能指向同一主机,但域名不同)。- 安全限制:
- 不能跨域名设置 Cookie(如
example.com
无法为google.com
设置 Cookie)。- 子域名可访问父域名的 Cookie(如
sub.example.com
可读取Domain=example.com
的 Cookie),但反之不行。3. 本地开发场景的 Domain 应用
- 场景:在 Postman 中测试本地服务(如
http://127.0.0.1:8080
)时,设置Domain=127.0.0.1
可确保 Cookie 仅在请求该地址时生效,避免干扰其他服务。- 对比:若设置为
Domain=localhost
,则 Cookie 会在请求localhost
时生效,需根据服务实际绑定的域名 / IP 选择。
总之:
Cookie 工作原理总结
- 发送机制:当浏览器访问符合
Domain
和Path
条件的地址(或则子域名)时,自动携带对应 Cookie 到请求头中。- 用途:用于状态保持(如登录)、用户偏好存储、跟踪用户行为等。
- 安全提示:
- 生产环境中避免将敏感数据(如密码)存入 Cookie。
- 合理设置
HttpOnly
和Secure
字段,防止 XSS 攻击和中间人窃密。
2.如何获得Cookie和Session
2.1获得Cookie的两种方法
先声明:Spring MVC是基于 Servlet API 构建的原始 Web 框架, 也是在Servlet的基础上实现的。
首先介绍两个类:
- HttpServletRequest :包含了HTTP请求中的所有信息(当然也包括Cookie(还有Cookie中的SessionID))
- HttpServletResponse:包含了HTTP响应里面的所有信息
比如向客户端发送的数据, 响应头, 状态码等. 通过这个对象提供的方法, 可以获得服务器响应的所有内容
看似这两个类十分的强大(其实就是很强大哈哈),但是我们使用这两个类的时候还是会频繁地出现一些相似的代码(不是很方便)。于是Spring MVC在这两个对象的基础上进行了封装, 给我们提供更加简单的使用方法(只是封装,但是本质上Spring MVC本质上还是从这两个类里面拿到数据,只是我们省事了)
2.1.1.使用HttpServletRequest获得Cookie的方法
@RequestMapping("/getCookie")public String getCookie(HttpServletRequest request, HttpServletResponse response) { //这两个参数不用传//因为这两个参数是Spring里面内置的对象,用的话需要声明,不需要就不用声明/* 本质上Spring也是直接从这两个类里拿的参数,就譬如这个拿参数就太传统了String name = request.getParameter("name");*///响应里面有什么response里面就有什么,我们想响应什么我们直接设置就好了//拿到CookieCookie[] cookies = request.getCookies();if (cookies != null) {Arrays.stream(cookies).forEach(ck -> System.out.println(ck.getName() + ";" + ck.getValue()));return "获取Cookie成功";}return "cookie为空";}
结果:可以看到Cookies为空(默认情况下,第一次访问时,浏览器默认不会携带任何 Cookie。 request.getCookies()
返回 null
,不会打印任何内容。 )
我们可以手动设置Cookie,其实这也是一种作弊的体现(其实我们也能修改SessionID,但是服务器没有这个SessionID也是白搭)
如何手动设置Cookie呢?
然后Header就会出现一个Cookie
然后就获取Cookie成功了
2.1.2.利用注解@CookieValue
@RequestMapping("/getCookie2") //直接通过注解的方式来获取,注解里面的值就是要获取的Cookie值public String getCookie2(@CookieValue("name") String name) {return "获取的Cookie- name" + name;}
结果:
设置Cookie还是很困难的,有兴趣的话大家可以自行学习哦~~
2.2.设置Session的三种方法
传统的获得Cookie的方法需要request.getCookies();(问就是)
这个我还要看,但不是现在
Spring还提供了一个内置类,直接获得Session对象--HttpSession
2.2.1.使用HttpServletRequest获得Session的方法
如何从Cookie中先拿到SessionID,根据SessionID获取Session对象,如果一开始没有Session,就会创建一个Session对象。获取Session里面的属性,前提是要有。但是Session是服务器用来存储用户信息的地方,我们没办法进行伪造,只能进行设置
@RequestMapping("/getSession1") //直接通过注解的方式来获取,注解里面的值就是要获取的Cookie值public String getSession1(HttpServletRequest request) {//从Cookie中先拿到SessionID,根据SessionID获取Session对象,如果一开始没有Session,就会创建一个Session对象HttpSession session = request.getSession();//获取Session里面的属性,前提是要有。但是Session是服务器用来存储用户信息的地方,我们没办法进行伪造,只能进行设置String name = (String) session.getAttribute("name"); // 获取name属性// 要进行强转一下,我们获取到的都是Object对象return "从session获得值: "+name;}
结果:
然后我们直接设置一下Session,代码实现:
@RequestMapping("/setSession1") //直接通过注解的方式来获取,注解里面的值就是要获取的Cookie值public String setSession1(HttpServletRequest request) {HttpSession session = request.getSession(); // 一样的先拿Session对象session.setAttribute("name","zhangsan"); // 我们这里设置什么都可以毕竟是设置成Object类,当然获取到的也是Object类return "设置session成功";}
然后再获得一下Session:
2.2.2.HttpSession获得Session的方法
@RequestMapping("/setSession2")public String setSession1(HttpSession session) { // 直接利用session对象session.setAttribute("name","zhangsan");return "设置session成功";}
2.2.3.@SessionAttribute注解的方法获得Session
@RequestMapping("/getSession3")public String getSession3(@SessionAttribute("name") String name) {return "username:"+name;}
2.3.设置Session的两种方法
2.3.1.HttpselvertResponse设置Session
上面第一种获得Session方法我们已经演示过(设置完SessionID会发生变化)
@RequestMapping("/setSession1") //直接通过注解的方式来获取,注解里面的值就是要获取的Cookie值public String setSession1(HttpServletRequest request) {HttpSession session = request.getSession(); // 一样的先拿Session对象session.setAttribute("name","zhangsan"); // 我们这里设置什么都可以毕竟是设置成Object类,当然获取到的也是Object类return "设置session成功";}
2.3.2.利用HttpSession设置Session
@RequestMapping("/setSession2")public String setSession1(HttpSession session) { // 直接利用session对象session.setAttribute("name","zhangsan");return "设置session成功";}
3.如何获得和设置请求头
3.1传统获取 header
@RequestMapping("/getHeader1")public String getHeader1(HttpServletRequest request){ //直接使用内置对象来String userAgent = request.getHeader("User-Agent");return "User-Agent:"+userAgent;}
3.2.注解@RequestHeader
@RequestMapping("/getHeader2")public String getHeader2(@RequestHeader("User-Agent") String userAgent) {return "userAgent:"+userAgent;}
4.响应
直接打印 Cookie
对象的问题,遍历数组并打印每个 Cookie
对象时:
for (Cookie ck : cookies) {System.out.println(ck); // 输出:jakarta.servlet.http.Cookie@e2b7326c }
不管是 cookies.toString()还是Arrays.toString(cookies),还是sout(Cookies)都需要Cookie中实现了自己的toString方法,不然就是打印的
类名+哈希值(jakarta.servlet.http.Cookie@e2b7326c)
-
原因:
Cookie
类没有重写toString()
方法,默认调用Object.toString()
,返回类名@哈希值
。 -
解决方案:手动输出
Cookie
的属性(如getName()
和getValue()
)。
在我们前面的代码例子中,都已经设置了响应数据, Http响应结果可以是数据, 也可以是静态页面。也可以针对响应设置状态码, Header信息等
上述就是Cookie(搭配domain)/Session(搭配HttpServletRequest+HttpSession)的全部内容啦,不知道您对文章中的问题和思想是否都学会理解了呢?
能看到这里相信您一定对小编的文章有了一定的认可。
有什么问题欢迎各位大佬指出
欢迎各位大佬评论区留言修正~~