一、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>