Cookie,Session

一、Cookie

1 Cookie概述

1.1 协议状态

有状态:有储存数据的功能,服务端可以通过协议本身判断该请求和上一个请求的关系
无状态:没有储存数据的功能,当一个客户端向服务端发送请求,然后服务端返回响应,连接就关闭了,在服务端不保留连接的有关信息
Http是无状态的,Cookie是一小段的文本信息(key-value键值对)
Cookie传递过程:

1.1.1 Client发送HTTP请求给Server,Server判断本次请求是否有携带Cookie

1.1.2 没有携带Cookie,则Server会在本次响应头中携带Set-Cookie响应头,Cookie信息就存在这个响应头中

1.1.3 Client读取本次响应头中的Set-Cookie数据,创建一个Cookie并将Cookie的值存储到浏览器中,之后请求Server会将Cookie的数据读出来放在请求体头中(请求头的名称就叫Cookie)

1.1.4 Server从请求头中获取Cookie信息,来判断是否是上一个人

在这里插入图片描述

1.2 Cookie的操作

1.2.1 Cookie创建

Cookie类的方法作用
Cookie(String name,String value)通过构造方法创建一个Cookie 参数:键和值,都是String类型
String getName()得到Cookie的键
String getValue()得到Cookie的值
HttpServletResponse对象作用
------------------------------------------------------------------------------------
addCookie(Cookie cookie)将服务器创建的Cookie通过响应发送给浏览器 参数:创建好的Cookie对象
Cookie设置过期时间说明
--------------------------------------------------------------------------------------

1.2.2 Cookie的销毁

| void setMaxAge(int expiry) | 设置会话过期的时间,单位是秒
正数:设置秒数
负数:无效,浏览器关闭就失效
零:删除Cookie |
默认情况下,浏览器关闭Cookie就销毁了

1.2.3 Cookie的获取

HttpServletRequest对象作用
Cookie[] getCookies()服务器得到浏览器端发送过来的所有的Cookie信息,返回的是一个Cookie的对象数组

1.2.4 Cookie中使用特殊字符的情况

类与方法说明
java.net.URLEncoder.encode(“字符串”,“utf-8”)把字符串使用utf-8进行编码
java.net.URLDecoder.decode(“字符串”,“utf-8”)把字符串使用utf-8进行解码

1.2.5 Cookie的携带路径

Cookie设置路径的方法功能
cookie.setPath(路径);用于设置Cookie访问的路径 访问这个路径或路径的子目录都可以访问Cookie 其它的路径无法访问
Cookie的默认路径为当前Servlet的同级目录
如果将携带路径设置为""(空字符串),那么该携带路径也为当前的servlet同级目录

1.2.6 Cookie的删除

Cookie的删除说明
setMaxAge(0)设置生命周期为0,表示删除Cookie的信息

二、Session

1 Session概述

Session是属于服务器端的会话技术,数据保存在服务器的内存中,每个会话中保存它自己的数据,其他会话不能访问,不同的会话之间不能实现数据的共享

2 Session与Cookie的区别

Cookie属于客户端的会话技术,数据保存在浏览器文件中,Cookie中键和值都是String类型
Session属于服务器端的会话技术,数据保存在服务器的内存中,Session中键是String,值是Object类型

3 HttpSession接口

创建会话

创建session描述
HttpSession request.getSession()作用:通过请求对象创建一个会话对象 如果当前用户会话不存在,创建会话。如果会话已经存在,这个方法返回已经存在的会话对象
HttpSession接口方法作用
String getId()得到会话的ID,在服务器上唯一的32位的十六进制数
long getCreationTime()表示会话创建的时间,返回long类型。表示1970-1-1到这个时间之间相差的毫秒数
long getLastAccessedTime()表示会话上次访问的时间
boolean isNew()判断当前是否是一个新的会话,是的返回true
ServletContext getServletContext()通过会话得到上下文对象

4 Session作用域

Session也是一个域对象

HttpSession的方法作用
Object getAttribute(“名字”)从会话域中得到一个值
void setAttribute(“名字”,Object数据)向会话域中添加一对键和值
void removeAttribute(“名字”)从会话域中删除键和值

5 Session的原理分析

在这里插入图片描述

5.1 第1次访问用户没有会话ID,调用getSession方法,服务器创建一个会话对象

5.2 每个会话都有一个唯一的ID,通过Cookie发送给浏览器。

5.3 浏览器得到会话ID,下次访问再通过Cookie发送给服务器,相当于带了密码条给服务器。

5.4 服务器通过Cookie中的ID,与服务器中会话ID进行比较,访问同一个会话域中数据

4 会话的过期时间

session中的方法说明
int getMaxInactiveInterval()得到服务器上会话最大的非活动时间间隔,默认是1800秒(30分钟)

时间间隔的含义:如果你在这段时间内再次发送请求给服务器,服务器将会重新计时

4.1 设置会话的存活时间

4.1.1 代码设置

HttpSession的方法功能描述
void setMaxInactiveInterval(int 秒)设置会话最大非活动时间时隔,单位是秒

4.1.2 设置xml

<session-config>
    <session-timeout>5</session-timeout>
</session-config>

4.1.2 立刻失效

HttpSession方法功能描述
invalidate()会话立刻失效,一般用于用户退出,注销

5 Session的生命周期

5.1何时创建?

request.getSession()`判断是否要创建session
请求头中的Cookie是否有携带会话ID
有携带:
根据会话ID去服务器里面查询对应的Session
查询到了:返回对应的session
查询不到:创建一个新的会话,并且在本次的响应头中添加Set-Cookie(内容就是本次的会话ID)
没有携带:创建一个新的会话,并且在本次的响应头中添加Set-Cookie(内容就是本次的会话ID)

5.2 何时销毁?

默认30分钟后销毁(在30分钟期间,如果获取了对应的会话,那么会过期时间会重新续期为30分钟),可以通过session.setMaxInactiveInterval()设置过期时间
调用session.invalidate()方法时立即销毁
服务器关闭时session销毁

5.3为什么浏览器关闭session就"销毁"了呢?

浏览器关闭是存储sessionid的cookie被销毁了,导致下次来到服务器端找不到上一次的会话,因此服务器会创建一个新的session,并将新session的id以cookie的形式写回到客户端

7 Session持久化

对象实现serializable接口
session的持久化也叫做钝化与活化
钝化:从内存到磁盘
活化:从磁盘到内存
在web目录下创建META-INF目录,然后创建Context.xml文件:

<Context>
   <!-- maxIdleSwap:session中的对象多长时间不使用就钝化(单位为分钟) -->
    <!-- directory:钝化后的对象的文件写到磁盘的哪个目录下  配置钝化的对象文件默认在work/catalina/localhost/钝化文件 -->
    <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
        <Store className="org.apache.catalina.session.FileStore" directory="d:/aaa" />
    </Manager>
</Context>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值