会话
会话管理分类
-
-
把要共享的数据保存到客户端。
-
每次请求时,把会话信息带到服务器端,从而实现多次请求的数据共享!
-
-
Session:服务器端会话管理技术
-
本质也是采用客户端会话管理技术。
-
只不过在客户端保存的是一个特殊标识,而共享的数据保存到了服务器端的内存对象中。
-
每次请求时,会将特殊标识带到服务器端,根据这个标识来找到对应的内存空间,从而实现数据共享!
-
cookie
什么是cookie?作用是什么?
-
Cookie:客户端会话管理技术
-
把要共享的数据保存到客户端(浏览器)
-
每次请求时,浏览器会把会话信息带到服务器端,从而实现多次请求的数据共享
-
-
作用:可以保存客户端访问网站的相关内容,从而保证每次访问时先从本地缓存中获取,以此提高效率!
-
cookie介绍
Cookie执行流程原理:
coolie常见属性?
属性名称 | 属性作用 | 是否重要 |
---|---|---|
name | cookie的名称 | 必要属性 |
value | cookie的值(不能是中文) | 必要属性 |
path | cookie的路径 | 重要 |
domain | cookie的域名 | 重要 |
maxAge | cookie的生存时间 | 重要 |
version | cookie的版本号 | 不重要 |
comment | cookie的说明 | 不重要 |
细节:
Cookie有大小,个数限制。每个网站最多只能存20个cookie,且大小不能超过4kb。同时,所有网站的cookie总数不超过300个。
当删除Cookie时,设置maxAge值为0。当不设置maxAge时,使用的是浏览器的内存,当关闭浏览器之后,cookie将丢失。设置了此值,就会保存成缓存文件(值必须是大于0的,以秒为单位)。
cookie的方法和添加获取
cookie方法
方法名 | 作用 |
---|---|
Cookie(String name,Stringvalue) | 构造方法创建对象 |
属性对应的set和get方法 | 赋值和获取值 |
添加:
HttpServletResponse对象中提供了addCookie()方法
返回值 | 方法名 | 说明 |
---|---|---|
void | addCookie(Cookie cookie) | 向客户端添加Cookie |
获取:
HttpServletRequest对象中提供了getCookies()方法
返回值 | 方法名 | 说明 |
---|---|---|
Cookie[] | getCookies(Cookie cookie) | 获取所有的Cookie |
为什么添加Cookie是响应对象,获取Cookie是请求对象?
-
因为cookie是通过服务器端代码将数据保存在浏览器,所以服务器让浏览器做一件事情,肯定是通过响应,而在浏览器存储的数据,要想告诉服务器都有什么,那肯定是通过请求
Cookie的使用细节
-
数量限制
-
每个网站最多只能有 20 个 Cookie,且大小不能超过 4KB。所有网站的 Cookie 总数不能超过 300 个。
-
-
名称限制
-
Cookie 的名称只能包含 ASCCI 码表中的字母、数字字符。不能包含逗号、分号、空格,不能以 $ 开头。
-
Cookie 的值不支持中文。
-
-
存活时间限制 setMaxAge() 方法接收数字
-
负整数:当前会话有效,浏览器关闭则清除。
-
0:立即清除。
-
正整数:以秒为单位设置存活时间。
-
-
访问路径限制
-
默认路径:取自第一次访问的资源路径前缀。只要以这个路径开头就能访问到
-
设置路径:setPath() 方法设置指定路径
-
设置Cookie最大存活时间
cookie.setMaxAge(0); // 立即清除
Cookie路径限制
-
取自第一次访问的资源路径前缀
-
只要以这个前缀为开头(包括子级路径)就可以获取到
-
反之获取不到
session
session执行流程:
什么是HttpSession?作用是什么?
服务器端会话管理技术
-
本质也是采用客户端会话管理技术
-
只不过在客户端保存的是一个特殊标识,而共享的数据保存到了服务器端的内存对象中
-
每次请求时,会将特殊标识带到服务器端,根据这个标识来找到对应的内存空间,从而实现数据共享
-
是 Servlet 规范中四大域对象之一的会话域对象
-
作用:可以实现数据共享
-
为了防止在 一次会话中,让用户多次登录(用户登录状态)
HttpSession的方法
Httpsession常用方法
返回值 | 方法名 | 说明 |
---|---|---|
void | setAttribute(String name,Object value) | 设置共享数据 |
Object | getAttribute(String name) | 获取共享数据 |
void | removeAttribute(String name) | 移除共享数据 |
String | getId() | 获取唯一标识名称 |
void | Invalidate() | 让session立即失效 |
HttpSession的获取
获取HttpSession是通过HttpServletRequest接口中的两个方法获取的
返回值 | 方法名 | 说明 |
---|---|---|
HttpSession | getSession() | 获取HttpSession对象 |
HttpSession | getSession(boolean create) | 获取HttpSession对象,对未获取到的是否创建(默认为true) |
HttpSession的钝化和活化
-
什么是钝化和活化
-
钝化:序列化。把长时间不用,但还不到过期时间的 HttpSession 进行序列化,写到磁盘上
-
活化:相反的状态
-
-
何时钝化
-
第一种情况:当访问量很大时,服务器会根据 getLastAccessTime 来进行排序,
对长时间不用,但是还没到过期时间的 HttpSession 进行序列化。
-
第二种情况:当服务器进行重启的时候,为了保持客户 HttpSession 中的数据,也要对其进行序列化
-
-
注意
-
HttpSession 的序列化由服务器自动完成,我们无需关心
-
四大域对象
域对象名称 | 范围 | 级别 | 备注 |
---|---|---|---|
PageContext | 页面范围 | 最小,只能在当前页面用 | 因范围太小,开发中用的很少 |
ServletRequest | 请求范围 | 一次请求或当期请求转发用 | 当请求转发之后,再次转发时请求域丢失 |
HttpSession | 会话范围 | 多次请求数据共享时使用 | 多次请求共享数据,但不同的客户端不能共享 |
ServletContext | 应用范围 | 最大,整个应用都可以使用 |