Cookie和Session在Servlet中的应用

目录

一、初识Cookie与Session

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

核心方法HttpServletRequest 类中的相关方法

 HttpServletResponse 类中的相关方法 

Cookie 类中的相关方法 

HttpSession 类中的相关方法

三、实战演练:网页登录 


一、初识Cookie与Session

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

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

显然这是一件非常难受的事情!
所以浏览器为了保护 用户电脑上的 资料,就会禁止页面的 js 访问到文件系统。
就是说,页面的 js 是获取不到:当前用户电脑上的文件有哪些 ,就别提进行删除操作了。
这是浏览器为了安全而引入的机制。


但是!这样的安全限制,也带来了一些麻烦。
因为有时候,我们确实需要让页面这里持久化存储一些数据,方便后续访问网站。
举个例子:
其中,最典型的,就是序要存储 用户当前的身份信息。
————————————————
我们在登录网站的时候,如果你前几天登录过,那么你在重新进入这个网站的时候。往往都是直接就登录进去了,不用再重复登录了。这是为什么呢?是网站储存了我们的信息了吗?是怎样储存的呢?

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

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

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

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

Cookie和Session在Servlet中的应用_第1张图片

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


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

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

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

在 Servlet 中,对于 Cookie 和 Session 都有很好的支持!
所以,我们就可以基于 Servlet 里面提供的 Cookie 和 Session 的 API,来进行会话管理类似的操作。

回忆之前的例子:

  1. 到了医院先挂号. 挂号时候需要提供身份证, 同时得到了一张 “就诊卡”, 这个就诊卡就相当于患者的 “令牌”(相当于是 cookie,里面存储这用户的详细信息).
  2. 后续去各个科室进行检查, 诊断, 开药等操作, 都不必再出示身份证了, 只要凭就诊卡即可识别出当前患者的身份.
  3. 看完病了之后, 不想要就诊卡了, 就可以注销这个卡. 此时患者的身份和就诊卡的关联就销毁了. (类似于网站的注销操作)
  4. 又来看病, 可以办一张新的就诊卡, 此时就得到了一个新的 “令牌

————————————————
Cookie和Session在Servlet中的应用_第2张图片

但其实在实际情况中,使用的是一个 session 的方式来保存的。
毕竟一个人,他可能不止一张卡,而且卡可能会丢。
因此将身份信息全部存储到卡上并不安全,所以,卡上只需要存储一个会话窗口编号(sessionId)。
通过这个会话窗口编号,就可以打开对应的窗口,调取对应的信息。

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


 

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

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

  1. HttpServlet
  2. HttpServletRequest(对应请求)
  3. HttpServletResponse(对应响应)

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

核心方法
HttpServletRequest 类中的相关方法

方法 描述
HttpSession
getSession()
在服务器中获取会话. 参数如果为 true, 则当不存在会话时新建会话; 参数如果
为 false, 则当不存在会话时返回 null
Cookie[]
getCookies()
返回一个数组, 包含客户端发送该请求的所有的 Cookie 对象. 会自动把
Cookie 中的格式解析成键值对

对于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,可以是一个一个的键值对,存放了用户信息:比如用户名、密码

Cookie和Session在Servlet中的应用_第3张图片

 HttpServletResponse 类中的相关方法 

Cookie和Session在Servlet中的应用_第4张图片


Cookie 类中的相关方法 

 Cookie和Session在Servlet中的应用_第5张图片

HttpSession 类中的相关方法

一个 HttpSession 对象里面包含多个键值对. 我们可以往 HttpSession 中存任何我们需要的信息

方法 描述
Object getAttribute(String
name)
该方法返回在该 session 会话中具有指定名称的对象,如果没
有指定名称的对象,则返回 null.
void setAttribute(String
name, Object value)
该方法使用指定的名称绑定一个对象到该 session 会话
boolean isNew() 判定当前是否是新创建出的会话


三、实战演练:网页登录 

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

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

我们简单来复习一下

1、创建Maven项目
2、引入Servlet依赖(通过Mawen中央仓库—把依赖代码放在pom.xml中)
3、构建目录结构,我们要手动创建webapp目录和WEB-INF目录以及他下面的web.xml文件,名字必须是这样(这样tomcat才能识别)
4、编写Servlet程序
5、通过tomcat打包部署
6、在浏览器中验证程序

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

Cookie和Session在Servlet中的应用_第6张图片

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

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

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

  • 1、登录(这个是静态页面,我们直接用html实现就好)
  • 2、获取主页(这个是动态的,用户不同,主页显示的也不同,我们可以用servlet代码来实现)

 Cookie和Session在Servlet中的应用_第7张图片

 注意:

针对前后端交互接口,这里有很多种约定方式。
这么多约定方式,使用哪种都可以!
一定要确定出一种约定方式,
然后前后端代码的编写,就需要围绕着这一种约定的方式进行编写。
如果如果不按照这种方式去写,代码会出现很多问题!
比如:请求是GET,但是服务器中处理请求的方法是POST,那么就会触发405.

来张图

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

Cookie和Session在Servlet中的应用_第8张图片

让我们看看抓包结果

Cookie和Session在Servlet中的应用_第9张图片

你可能感兴趣的:(JavaEE初阶,servlet,前端,java)