Cookie和Session在Servlet中的应用

简介: Cookie和Session在Servlet中的应用

一、初识Cookie与Session

明确一点:浏览器,为了安全,默认情况下是不能让页面的 js 访问到 用户电脑上的文件系统的。


假设某个网页上,包含恶意代码。

然后,我们不小心点到的,就可能触发这个恶意代码,可能就把你电脑上的 资料 全给删除了。


显然这是一件非常难受的事情!

所以浏览器为了保护 用户电脑上的 资料,就会禁止页面的 js 访问到文件系统。

就是说,页面的 js 是获取不到:当前用户电脑上的文件有哪些 ,就别提进行删除操作了。

这是浏览器为了安全而引入的机制。


但是!这样的安全限制,也带来了一些麻烦。

因为有时候,我们确实需要让页面这里持久化存储一些数据,方便后续访问网站。

举个例子:

其中,最典型的,就是序要存储 用户当前的身份信息。

————————————————

我们在登录网站的时候,如果你前几天登录过,那么你在重新进入这个网站的时候。往往都是直接就登录进去了,不用再重复登录了。这是为什么呢?是网站储存了我们的信息了吗?是怎样储存的呢?


答案是:网站就是通过Cookie来做到这一点的,我们虽然不能让网站这个页面的JS代码直接访问我们的磁盘文件,但我们可以给浏览器单独分配一个“小黑屋”(也就是一块单独的空间,这样JS代码就只会再我们所开辟的这个小黑屋里折腾,是不会影响到我们磁盘上的其他文件}


对于小黑屋的提供,我们有好几种形式和实现方法,其中Cookie就是一个比较经典的做法。

Cookie本质上,就是浏览器给页面提供的一种能够持久化存储数据的机制

持久化指的是:数据不会因为程序的重新或者主机的重启而丢失,数据是存储在硬盘当中的,而不是在很容易丢失的磁盘上。


79ff081ab1174e588db4acf4e82296a9.png

光说意义不大,我们来登录个网站,实际抓包看一下

8ae912f0e76f49be8ab0b6a786661daa.png


二、与Cookie和Session相关API的学习

是不是有点蒙,光听理论是不行的,下面我们来进行一下实战演练。通过一个servlet登录功能的实现来看看Cookie和Session在其中所发挥的巨大作用。


在开始之前我们先学习一下servlet中为Cookie还有Session提供的API


在 Servlet 中,对于 Cookie 和 Session 都有很好的支持!

所以,我们就可以基于 Servlet 里面提供的 Cookie 和 Session 的 API,来进行会话管理类似的操作。


回忆之前的例子:


到了医院先挂号. 挂号时候需要提供身份证, 同时得到了一张 “就诊卡”, 这个就诊卡就相当于患者的 “令牌”(相当于是 cookie,里面存储这用户的详细信息).

后续去各个科室进行检查, 诊断, 开药等操作, 都不必再出示身份证了, 只要凭就诊卡即可识别出当前患者的身份.

看完病了之后, 不想要就诊卡了, 就可以注销这个卡. 此时患者的身份和就诊卡的关联就销毁了. (类似于网站的注销操作)

又来看病, 可以办一张新的就诊卡, 此时就得到了一个新的 “令牌

0f68a340d1024859a6ee614c77582dcd.png

但其实在实际情况中,使用的是一个 session 的方式来保存的。

毕竟一个人,他可能不止一张卡,而且卡可能会丢。

因此将身份信息全部存储到卡上并不安全,所以,卡上只需要存储一个会话窗口编号(sessionId)。

通过这个会话窗口编号,就可以打开对应的窗口,调取对应的信息。


也就是说:

每一张卡 相当于 开启了 一个会话窗口,都可以通过这个会话窗口来获取自身的详细信息。


好了,前言铺垫完毕,下面来正式结束servlet中对于Cookie和Session提供的API,大家还记得

我们上一篇博客中提到的Servlet中那三个重要的类吗


HttpServlet

HttpServletRequest(对应请求)

HttpServletResponse(对应响应)

我们的cookie和session是在我们登录网站时,来保存数据的。那么它们自然与请求和响应有着不可分割的关系

核心方法

🌰HttpServletRequest 类中的相关方法


image.png


🍑对于getSession来说,获取会话的大致流程如下:


首先拿到请求中Cookie中的sessionId字段,sessionId就相当于是会话的身份标识 。然后我们就去判断这个sessionId在服务器的session(类似哈希表)中存在不存在。


如果存在,就通过这个sessionId来获取到服务器中的会话对象,并通过返回值的形式把这个HttpSession对象返回去。


如果不存在,就会创建一个HttpSession会话对象,并且生成对应的sessionId

sessionId 是一个很长的数字,通常是用 十六进制来表示的。

这个数字能够保证唯一性:它这里面有一些列相关的算法,能够生成一个唯一的sessionId,然后这个Id 就作为我们当前会话的身份标识。


接下来,就把 sessionId 作为 key,把这个 HttpSession 对象,作为 value。

把这个键值对,给保存到 服务器内存 的一个“哈希表” 这样的结构中。

这里的“哈希表”:只是表示一个类似 哈希表的数据结构。

也就是说,一定是一个键值对结构,但是 是不是 哈希表 就不能保证了。


再然后,服务器就会返回一个 HTTP 响应,把 sessionId 通过 Set-Cookie 字段 返回给浏览器。

然后,浏览器就可以保存这个 sessionId 到 cookie中了。


 说了这么多,那么这个所谓的HttpSession到达是个什么东东?

这个对象本质上也是一个键值对的结构,

sessionId是其中的key,对于他的value,可以是一个一个的键值对,存放了用户信息:比如用户名、密码



ffca8da14bac45c9ab646385b172bae5.png

🌰HttpServletResponse 类中的相关方法


4482f475275841e88f1857be258f3c8b.png

🌰Cookie 类中的相关方法

 

d639b8646b9f4bbeb43feb0244754b6f.png


🌰 HttpSession 类中的相关方法


image.png

三、实战演练:网页登录

好了,我们的前置知识铺垫完成,来正式开始我们的项目吧!!!

大家还记得一个Maven项目的创建流程吗?

我们简单来复习一下


1、创建Maven项目

2、引入Servlet依赖(通过Mawen中央仓库—把依赖代码放在pom.xml中)

3、构建目录结构,我们要手动创建webapp目录和WEB-INF目录以及他下面的web.xml文件,名字必须是这样(这样tomcat才能识别)

4、编写Servlet程序

5、通过tomcat打包部署

6、在浏览器中验证程序


下面我们来分析一下这个网页登录的大致流程


09581231a0664622af565e62d99f0f31.png

在理解了上述登录页面的代码后,我们就可以开始尝试开发了。


在编写代码前,首先我们要约定好前后端的交接端口


根据上面的逻辑图,一共有两组交互:


1、登录(这个是静态页面,我们直接用html实现就好)

2、获取主页(这个是动态的,用户不同,主页显示的也不同,我们可以用servlet代码来实现)


6c50d65fb12f491f8032157e60721951.png

注意:


针对前后端交互接口,这里有很多种约定方式。

这么多约定方式,使用哪种都可以!

一定要确定出一种约定方式,

然后前后端代码的编写,就需要围绕着这一种约定的方式进行编写。

如果如果不按照这种方式去写,代码会出现很多问题!

比如:请求是GET,但是服务器中处理请求的方法是POST,那么就会触发405.


来张图


c21176342ccf480491939ce0314c45a4.png

看一下我们的代码执行效果


10f486c013a14812b0654396964fef7e.png

让我们看看抓包结果

be9c208620b541bcbd88aa960850cb4d.png

相关文章
|
2天前
|
存储 前端开发 Java
JavaWeb基础7——会话技术Cookie&Session
会话技术、Cookie的发送和获取、存活时间、Session钝化与活化、销毁、用户登录注册“记住我”和“验证码”案例
JavaWeb基础7——会话技术Cookie&Session
|
21天前
|
存储 JavaScript 前端开发
Cookie 反制策略详解:Cookie加解密原理、Cookie和Session机制、Cookie hook、acw_sc__v2、jsl Cookie调试、重定向Cookie
Cookie 反制策略详解:Cookie加解密原理、Cookie和Session机制、Cookie hook、acw_sc__v2、jsl Cookie调试、重定向Cookie
39 1
|
23天前
|
存储 安全 搜索推荐
【JavaWeb 秘籍】Cookie vs Session:揭秘 Web 会话管理的奥秘与实战指南!
【8月更文挑战第24天】本文以问答形式深入探讨了Web开发中关键的会话管理技术——Cookie与Session。首先解释了两者的基本概念及工作原理,随后对比分析了它们在存储位置、安全性及容量上的差异。接着,通过示例代码详细介绍了如何在JavaWeb环境中实现Cookie与Session的操作,包括创建与读取过程。最后,针对不同应用场景提供了选择使用Cookie或Session的指导建议,并提出了保障二者安全性的措施。阅读本文可帮助开发者更好地理解并应用这两种技术。
28 1
|
26天前
|
存储 安全 搜索推荐
深入探讨Session和Cookie的概念、用途以及如何在Java Web开发中有效地使用它们进行用户状态管理。
在Java Web开发中,Session和Cookie是管理用户状态的核心技术。Session存储于服务器端,通过唯一的Session ID识别用户,确保数据安全与隐私;Cookie则存储于客户端,用于记录用户偏好等信息。两者各有优势:Session适合存储敏感数据,但需合理管理避免资源浪费;Cookie便于持久化存储,但在安全性上需谨慎设置。开发者可通过Servlet API轻松操作二者,实现个性化用户体验与应用性能优化。
25 2
|
26天前
|
存储 缓存 安全
Cookie和Session
【8月更文挑战第20天】
15 1
|
1月前
|
存储 JSON JavaScript
震撼!Cookie、Session、Token、JWT 终极对决:揭开 Web 认证的神秘面纱!
【8月更文挑战第13天】Web 开发中,Cookie、Session、Token 和 JWT 常混淆。Cookie 是服务器给客户端的小信息片,如登录状态,每次请求都会返回。Session 则是服务器存储的用户数据,通过 Session ID 追踪。Token 类似通行证,证明客户端身份且可加密。JWT 是结构化的 Token,含头部、载荷及签名,确保数据完整性和安全性。
38 4
|
15天前
|
C# 开发者 Windows
WPF遇上Office:一场关于Word与Excel自动化操作的技术盛宴,从环境搭建到代码实战,看WPF如何玩转文档处理的那些事儿
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的重要组件,以其强大的图形界面和灵活的数据绑定功能著称。本文通过具体示例代码,介绍如何在 WPF 应用中实现 Word 和 Excel 文档的自动化操作,包括文档的读取、编辑和保存等。首先创建 WPF 项目并设计用户界面,然后在 `MainWindow.xaml.cs` 中编写逻辑代码,利用 `Microsoft.Office.Interop` 命名空间实现 Office 文档的自动化处理。文章还提供了注意事项,帮助开发者避免常见问题。
44 0
|
2月前
|
存储 安全 搜索推荐
Cookie和Session的区别,99%的程序员都不知道的细节!
大家好,我是小米,在Web开发中,Cookie和Session是两种重要的状态管理工具。它们有着不同的存储位置、安全性和应用场景。本篇文章将详细解析它们的区别和应用,让你在开发过程中能够更加游刃有余。让我们一起深入了解吧!
53 1
|
1月前
Error unprotecting the session cookie.The key {...} was not found in the key ring.
Error unprotecting the session cookie.The key {...} was not found in the key ring.
48 0
|
1月前
Error unprotecting the session cookie.The payload was invalid.
Error unprotecting the session cookie.The payload was invalid.
51 0