【JavaEE进阶】获取Cookie/Session

目录

🍀Cookie简介

🎄理解Session

🌳Cookie 和 Session 的区别

🌲获取Cookie

🚩传统获取Cookie

🚩注解获取Cookie

🌴获取Session

🚩Session存储

🚩Session读取

🏀传统读取Session

🏀简洁获取Session

🏀注解获取Session


🍀Cookie简介

HTTP协议自身是属于 "⽆状态"协议.

"⽆状态"的含义指的是:

  • 默认情况下 HTTP 协议的客⼾端和服务器之间的这次通信,和下次通信之间没有直接的联系.但是实际开发中,我们很多时候是需要知道请求之间的关联关系的.

例如登陆⽹站成功后,第⼆次访问的时候服务器就能知道该请求是否是已经登陆过了.

上图中输入用户名和密码,点击登录之后,将这个登录请求发送给服务器,这个请求携带着用户名密码信息发送给服务器,服务器将用户名和密码进行存储(session),生成一个sessionId(sessionId对应session信息)返回给客户端,存于cookie中,访问其他页面时就可以携带cookie进行访问。

上述图中的"令牌"通常就存储在Cookie字段中. ⽐如去医院挂号

  1. 看病之前先挂号.挂号时候需要提供⾝份证号,同时得到了⼀张"就诊卡",这个就诊卡就相当于患 者的"令牌".
  2. 后续去各个科室进⾏检查,诊断,开药等操作,都不必再出⽰⾝份证了,只要凭就诊卡即可识别出当 前患者的⾝份.
  3. 看完病了之后,不想要就诊卡了,就可以注销这个卡.此时患者的⾝份和就诊卡的关联就销毁了.(类 似于⽹站的注销操作)
  4. ⼜来看病,可以办⼀张新的就诊卡,此时就得到了⼀个新的"令牌"

此时在服务器这边就需要记录"令牌"信息,以及令牌对应的⽤⼾信息,这个就是 Session 机制所做的⼯作

🎄理解Session

要理解Session,我们先来理解一下会话

在计算机领域,会话是⼀个客⼾与服务器之间的不中断的请求响应.对客⼾的每个请求,服务器能够识别出请求来⾃于同⼀个客⼾.

当⼀个未知的客⼾向Web应⽤程序发送第⼀个请求时就开始了⼀个会话.当客⼾明确结束会话或服务器在⼀个时限内没有接受到客⼾的任何请求时,会话就结束了.

⽐如我们打客服电话
每次打客服电话,是⼀个会话.挂断电话,会话就结束了
下次再打客服电话,⼜是⼀个新的会话.
如果我们⻓时间不说话,没有新的请求,会话也会结束

服务器同⼀时刻收到的请求是很多的.服务器需要清楚的区分每个请求是从属于哪个⽤⼾,也就是属于哪个会话,就需要在服务器这边记录每个会话以及与⽤⼾的信息的对应关系.

Session是服务器为了保存⽤⼾信息⽽创建的⼀个特殊的对象

Session的本质就是⼀个"哈希表",存储了⼀些键值对结构.Key 就是SessionID,Value就是⽤⼾信息(⽤⼾信息可以根据需求灵活设计).

SessionId 是由服务器⽣成的⼀个"唯⼀性字符串",从Session机制的⻆度来看,这个唯⼀性字符串称 为SessionId .但是站在整个登录流程中看待,也可以把这个唯⼀性字符串称为token .

上述例⼦中的令牌ID,就可以看做是SessionId,只不过令牌除了ID之外,还会带⼀些其他信息,⽐如时 间,签名等.

  1. 当⽤⼾登陆的时候,服务器在 Session 中新增⼀个新记录, 把 sessionId返回给客⼾端.(通过HTTP 响应中的 Set-Cookie 字段返回).
  2. 客⼾端后续再给服务器发送请求的时候,需要在请求中带上sessionId.(通过HTTP请求中的Cookie字段带上).
  3. 服务器收到请求之后,根据请求中的sessionId在Session信息中获取到对应的⽤⼾信息,再进⾏后续操作.找不到则重新创建Session,并把SessionID返回

Session 默认是保存在内存中的. 如果重启服务器则 Session 数据就会丢失

🌳Cookie 和 Session 的区别

  • Cookie 是客⼾端保存⽤⼾信息的⼀种机制.Session 是服务器端保存⽤⼾信息的⼀种机制.
  • Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId是 Cookie 和 Session 之间的桥梁
  • Cookie 和 Session 经常会在⼀起配合使⽤. 但是不是必须配合
  •          完全可以⽤ Cookie 来保存⼀些数据在客⼾端.这些数据不⼀定是⽤⼾⾝份信息,也不⼀定           是SessionId
  •          Session 中的sessionId 也不需要⾮得通过 Cookie/Set-Cookie 传递,⽐如通过URL传递

🌲获取Cookie

要想获取Cookie,首先得有Cookie,由于Cookie是存储在客户端的,所以可以伪造,我们就可以通过postman伪造Cookie。

postman伪造Cookie:

步骤一:

步骤二:添加domain(domain可以理解为IP或者域名,例如:127.0.0.1, www.jd.com)

步骤三 :添加Cookie,也是键值对的方式添加

此时Cookie就构造好了,可以在Header中查看

浏览器伪造Cookie: 

伪造京东的Cookie,进入京东页面的开发者工具(F12):

通过上述操作,我们就构造好了Cookie,下面就通过代码来获取Cookie

在默认情况下,不管后端的接口是否会用到Cookie,前端在发送请求的时候,会把Cookie一起发送过来,那么服务器就只需要在请求里面拿取对应的Cookie即可。拿取Cookie有两种方式

🚩传统获取Cookie

有一个HttpServletRequest对象,和HttpServletResponse对象,这两个对象分别对应的是HTTP请求,HTTP响应,也就是整个HTTP请求里面有什么HttpServletRequest就有什么,整个HTTP响应有什么HttpServletResponse就有什么。这些信息都可以通过这两个对象获取出来,例如Cookie,User-Agent等信息。

Spring MVC是基于 Servlet API 构建的原始 Web 框架, 也是在Servlet的基础上实现的

HttpServletRequest , HttpServletResponse 是Servlet提供的两个类,是Spring MVC⽅法的内置对象.需要时直接在⽅法中添加声明即可.

HttpServletRequest对象代表客⼾端的请求,当客⼾端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的⽅法,可以获得客⼾端请求的所有信息.

HttpServletResponse 对象代表服务器的响应. HTTP响应的信息都在这个对象中, ⽐如向客⼾端发送的数据, 响应头,状态码等. 通过这个对象提供的⽅法, 可以获得服务器响应的所有内容

Spring MVC在这两个对象的基础上进⾏了封装, 给我们提供更加简单的使⽤⽅法.

在之前的操作中,我们获取参数就是自己定义一个类型来接收,此时我们就可以通过HttpServletRequest对象来获取参数。这也是传统的Servlet的做法,也就是Spring底层

代码:获取Cookie

通过浏览器发起请求:发现报了一个500服务器错误

查看服务器日志:出现了空指针异常,说明代码的30行某个值为null,通过观察代码发现,一定是cookies为null,在上述我们设置了京东的cookie,但是cookie不能跨域的,它只能作用在当前的domain下,所以我们访问的域名是127.0.0.1,这个域名我们是没有设置Cookie的,即cookie为null,那么在循环cookie之前,判断一下cookie是否为null即可

代码:

发起请求:

由于cookie中什么都没有,所以什么都没有打印,但是这个接口是访问成功了的

此时给当前domain添加cookie:

重新发起请求查看后端日志:

获取其中一个cookie对象:

发起请求查看后端日志:

🚩注解获取Cookie

也有更简洁的方式获取Cookie,@CookieValue(),在括号里面填写你想要获取的key。

代码:

浏览器发送请求查看后端日志:

这个注解做的事情就是上述传统获取Cookie的内容,但是传统方式还是用的比较多一点

注意:

  • 这个虽然获取更简单,但是一次只能获取你想要获取的参数,不能获取全部参数

🌴获取Session

Session是服务器端的机制,我们需要先存储,才能再获取

Session 也是基于HttpServletRequest来存储和获取的

🚩Session存储

 代码:

这个代码中看不到 SessionId 这样的概念的. getSession 操作内部提取到请求中的Cookie⾥的 SessionId, 然后根据SessionId获取到对应的Session 对象, Session 对象⽤HttpSession来描述

 清除掉上述domain中的Cookie

浏览器发送请求:

fiddler抓包:通过上述代码设置了session信息,服务器返回的时候就生成了一个session对象,即在响应中有一个set-Cookie返回给客户端,告诉客户端sessionId,客户端自动存储起来

此时客户端的Cookie中就有了sessionId键值对:

再访问其他接口时,Cookie就会带上这个sessionId,虽然param1不需要这个Cookie,但是后续所有的请求都会带上这个Cookie(前提是要保证是同一个客户端同一个domain)

小结:

获取Session有以下两种⽅式:

HttpSession getSession(boolean create)

  • 参数如果为 true, 则当不存在会话时新建会话;
  • 参数如果为 false, 则当不存在会话时返回 null

HttpSession getSession(): 和getSession(true) 含义⼀样, 默认值为true.

void setAttribute(String name, Object value): 使⽤指定的名称绑定⼀个对象到该 session 会话

🚩Session读取

🏀传统读取Session

读取 Session 可以使⽤传统的 HttpServletRequest

 代码:

发送请求:直接访问getSession接口,后端日志打印的确是null

注意:要想获取session,必须先设置session,即先访问setSession接口,再访问getSession接口

🏀简洁获取Session

通过注解的方式获取Session

代码:

发送请求:先设置,再获取

🏀注解获取Session

代码:

发送请求一:未设置Session(若required为true,未设置Session获取则报400)

发送请求二:设置Session

<think>嗯,用户想了解Java EE的学习路线,我得先理清楚Java EE现在的体系。首先,Java EE已经改名为Jakarta EE了,不过大家可能还是习惯叫Java EE,所以需要提到这一点,避免混淆。然后,用户可能是刚开始学习Java,或者已经有一定基础,想转企业级开发,得从基础开始讲起。 首先,Java基础肯定是必须的,比如面向对象、集合、IO这些。然后是数据库,MySQL和JDBC,这部分是后端的基础。接着是Web基础,HTML、CSS、JavaScript,虽然前端不是重点,但至少要懂基础。Servlet和JSP是Java EE的核心,必须详细讲,包括生命周期、Filter、Listener这些。 接下来框架部分,Spring家族现在是主流,Spring Boot简化了配置,可能比传统的Spring MVC更推荐先学。还有ORM框架,比如Hibernate和MyBatis,用户需要了解两者的区别和应用场景。微服务现在很火,Spring Cloud相关组件也得介绍,但可能需要放在后面,作为进阶内容。 工具方面,Maven和Git是必备的,构建和版本控制。服务器如Tomcat、Jetty也需要熟悉。测试部分,JUnit和Postman对保证代码质量很重要,不能漏掉。 学习资源方面,官方文档、书籍、在线课程都需要推荐,比如《Head First Servlet & JSP》和Spring的官方指南。项目实战是关键,通过实际项目巩固知识,可以列举一些常见的项目类型,比如电商、管理系统。 注意事项里要强调动手实践,理解原理,关注社区变化,比如Jakarta EE的更新。最后,路线分阶段,从基础到进阶,再到深入,逐步推进。可能用户的实际水平和目标不同,需要灵活调整路线。 要确保内容结构清晰,分点列出,重点突出,同时语言口语化,避免太技术化的术语,让初学者容易理解。还要检查有没有遗漏的重要知识点,比如容器技术Docker,或者安全方面的知识,是否需要加入?不过可能放在进阶部分更合适,避免信息过载。 总之,整理出一个循序渐进的学习路径,覆盖从基础到框架再到部署和微服务的整个流程,帮助用户建立完整的知识体系,并提供学习资源建议和实战项目推荐,最后提醒注意事项,鼓励持续学习。</think>Java EE(现更名为 **Jakarta EE**)是 Java 企业级应用开发的核心技术栈,适合构建复杂、高并发的分布式系统。以下是一份系统的学习路线建议,涵盖从基础到进阶的关键知识点,结合当前主流技术趋势(如微服务、云原生等): --- ### **一、基础阶段** #### 1. **Java 核心基础** - 语法基础:数据类型、流程控制、面向对象(封装、继承、多态)、异常处理。 - 核心类库:集合框架(List/Set/Map)、IO/NIO、多线程(Thread、锁机制)、反射、泛型。 - 开发工具:IDEA/Eclipse、Maven/Gradle(依赖管理)、Git(版本控制)。 #### 2. **数据库与 SQL** - **关系型数据库**:MySQL/Oracle,掌握 SQL 语法(CRUD、事务、索引、连接查询)。 - **JDBC**:数据库连接、PreparedStatement、连接池(HikariCP、Druid)。 #### 3. **Web 基础** - 前端基础:HTML/CSS/JavaScript(了解即可,非前端重点)。 - HTTP 协议:请求/响应结构、状态码、Cookie/Session 原理。 - 后端入门:Servlet(生命周期、Request/Response)、JSP(已逐渐被模板引擎取代,了解即可)。 --- ### **二、核心框架与技术** #### 1. **Spring 生态** - **Spring Framework**:IoC(控制反转)、AOP(面向切面)、Spring MVC(Web 开发)。 - **Spring Boot**:自动化配置、Starter 依赖、Restful API 开发、集成 MyBatis/JPA。 - **Spring Security**:认证与授权、OAuth2/JWT(分布式安全方案)。 #### 2. **ORM 框架** - **MyBatis**:XML/注解配置、动态 SQL、关联映射。 - **JPA/Hibernate**:对象关系映射(ORM)、JPQL、Hibernate 缓存机制。 #### 3. **中间件与工具** - **Redis**:缓存、分布式锁、数据结构(String/Hash/List)。 - **消息队列**:RabbitMQ/Kafka,实现异步解耦与削峰填谷。 - **Elasticsearch**:全文检索、日志分析(可选,根据需求学习)。 --- ### **三、进阶与微服务** #### 1. **分布式与微服务** - **Spring Cloud** 全家桶: - 服务注册与发现:Eureka/Nacos。 - 负载均衡:Ribbon/OpenFeign。 - 配置中心:Spring Cloud Config/Nacos。 - 服务熔断:Hystrix/Sentinel。 - 网关:Spring Cloud Gateway/Zuul。 - **Dubbo**:RPC 框架(可选,传统分布式架构常用)。 #### 2. **容器化与 DevOps** - **Docker**:镜像与容器管理、Dockerfile 编写。 - **Kubernetes**:Pod/Deployment/Service 概念(企业级容器编排)。 - **CI/CD**:Jenkins/GitLab CI,实现自动化部署。 #### 3. **云原生技术** - 服务网格:Istio(微服务治理)。 - 无服务器架构:Serverless(如 AWS Lambda)。 --- ### **四、项目实战与经验积累** 1. **实战项目推荐**: - 电商系统:商品管理、订单流程、支付对接。 - 权限管理系统:RBAC 模型、动态菜单。 - 秒杀系统:高并发设计(限流、缓存、队列)。 - 微服务项目:拆分业务模块,集成 Spring Cloud。 2. **学习资源**: - 书籍:《Spring 实战》《深入理解 Java 虚拟机》《凤凰架构》。 - 文档:[Spring 官方文档](https://spring.io/)、[阿里巴巴 Java 开发手册](https://github.com/alibaba/p3c)。 - 视频:B 站慕课网、极客时间专栏。 --- ### **五、注意事项** 1. **避免“过度学框架”**:先理解底层原理(如 Servlet 生命周期、Spring AOP 实现机制)。 2. **关注社区动态**:Jakarta EE 更新、Spring 6 新特性(如响应式编程)。 3. **参与开源项目**:GitHub 上学习优秀代码,积累工程经验。 --- ### **学习路线总结** ``` Java 基础 → 数据库 → Web 基础 → Spring → 中间件 → 微服务 → 云原生 → 项目实战 ``` 根据个人目标调整方向(如传统企业应用侧重 Jakarta EE,互联网企业侧重 Spring Cloud + 云原生)。保持持续学习,结合实际项目深化理解!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值