一、会话
什么是会话呢???
当浏览器发送申请拜访服务器开始,始终到拜访服务器完结,浏览器敞开为止,这期间浏览器和服务器之间产生的所有申请和响应加在一起,就称之为浏览器和服务器之间的一次 会话 。
在一次会话中往往会产生一些数据,而这些数据往往是须要咱们保存起来的。
那么如何保留会话中产生的数据呢?
!!能够应用 cookie 或 session 保留会话中产生的数据。
二、cookie
cookie 的工作原理
(1)Cookie 是将会话中产生的数据保留在浏览器客户端,是客户端技术
(2)Cookie 是基于两个头进行工作的: 别离是Set-Cookie 响应头 和Cookie 申请头 :
服务器在响应中给浏览器发送 Cookie 时,是通过 Set-Cookie 响应头将 cookie 从服务器端发送给客户端浏览器,让浏览器保留到外部;而浏览器外部一旦保留了 cookie,当前浏览器每次拜访服务器时,都会通过 cookie 申请头,将 cookie 信息从浏览器再带回服务器端,如果服务器端须要,能够获取申请中的 cookie,从 cookie 中获取保留的数据,从而实现某些性能。
cookie 的 API 及利用
1、创立 Cookie 对象
`Cookie c = new Cookie(String name, String value);
// 创立 Cookie 的同时须要制订 Cookie 的名字 以及 cookie 中要保留的值(数据)`
2、将 Cookie 增加到 response 响应中
`response.addCookie(Cookie c);
// 将 Cookie 增加到 response 响应中, 由服务器负责将 cookie 信息发送给浏览器, 再由浏览器保留到外部
// 能够屡次调用该办法, 增加一个以上的 cookie`
3、获取申请中的所有 cookie 对象组成的数组
`Cookie[] cs = request.getCookies();
// 获取申请中携带的所有 cookie 组成的 cookie 对象数组;
// 如果申请中没有携带任何 cookie, 调用该办法会返回 null 值。`
4、删除浏览器中的 Cookie
在 cookie 的 API 中没有提供间接将 cookie 删除的办法, 能够通过别的形式间接删除 cookie
代码示例:删除名称为 cart 的 cookie: 能够向浏览器再发送一个同名的 cookie(即名称也叫 cart),并设置 cookie 的最大生存工夫为零,因为浏览器是依据 cookie 的名字来辨别 cookie,如果前后两次向浏览器发送同名的 cookie,后发送的 cookie 会笼罩之前发送的 cookie,而后发送的 cookie 也设置了生存工夫为零,因而浏览器收到后也会立刻删除!
`// 创立一个名称为 cart 的 cookie
Cookie c = new Cookie(“cart” , “”);
// 设置 cookie 的最大生存工夫为零
c.setMaxAge(0);
// 将 cookie 增加到响应中, 发送给浏览器
response.addCookie(c);`
5、Cookie 的罕用办法
`cookie.getName() // 获取 cookie 的名字
cookie.getValue() // 获取 cookie 中保留的值
cookie.setValue() // 设置 / 批改 cookie 中保留的值(没有 setName 办法, 因为 cookie 的名字无奈批改)
cookie.setMaxAge() // 设置 cookie 的最大生存工夫 `
三、session
session 的工作原理
(1)session 保留在服务器端,属于服务器端技术
(2)session 是一个域对象,session 中保留了一个 map 汇合,往 session 中存数据,其实就是将数据保留到 session 的 map 汇合中
(3) 通过 session.setAttribute 办法能够将数据保留到 session 对象 map 汇合中, 通过 session.getAttribute 办法能够将数据从 session 中取出来。
session 作为域对象应用
Session 是一个域对象,因而 session 中也提供了存取数据的办法。
session.setAttribute(String attrName, Object attrValue);
// 往 session 域中增加一个域属性, 属性名只能是字符串, 属性值能够是任意类型
session.getAttribute(String attrName);
// 依据属性名获取 session 域中的属性值, 返回值是一个 Object 类型
如何获取 session 对象:
HttpSession session = request.getSession(); // 获取一个 session 对象, 如果在服务器外部有以后浏览器对应的 session 对象, 则间接返回该 session 对象; 如果在服务器外部没有对应 session, 则会创立一个新的 session 对象再返回。
Session 域对象的三大特色:
(1)生命周期:
创立 session: 在第一次调用 request.getSession()办法时, 会创立一个 session 对象 (当客户端在服务器端没有对应的 session 时, 调用 request.getSession 办法会让创立一个 session 对象并返回)
销毁 session:
a)超时销毁: 默认状况下, 当超过 30 分钟没有拜访 session, session 就会超时销毁 (30 分钟是默认工夫, 能够批改, 但不举荐批改)
b) 他杀: 调用 session 的 invalidate 办法, 会立刻销毁 session
c)意外身亡: 当服务器非正常敞开时 (断电 / 硬件损坏 / 内存溢出等导致服务器意外敞开), session 会随着服务器的敞开而销毁;
当服务器失常敞开, 在敞开之前, 服务器会将外部的 session 对象序列化保留到服务器的 work 目录下, 变为一个文件, 这个过程叫做 session 的序列化 (也叫做钝化)。再次启动服务器, 钝化着的 session 会再次回到服务器,变为服务器中的 session 对象,这个过程叫做 session 的反序列化(活化)
(2) 作用范畴:(同一个客户端)在一次会话中, 获取到的都是同一个 session 对象
(3)次要性能:在一次会话范畴内实现数据的共享
cookie 和 session 的区别
Session 和 cookie 都属于会话技术, 都能够用于保留会话中产生的数据, 但因为 Cookie 和 Session 的工作原理和特点不同, 因而两者的利用场景也不一样。
cookie 的特点
1、cookie 是将会话中产生的数据保留在 浏览器客户端, 是客户端技术
2、cookie 是将数据保留在客户端浏览器,容易随着用户的操作导致 cookie 失落或者被窃取,因而 cookie 中保留的数据不太稳固,也不太平安。
但 cookie 将数据保留在客户端,对服务器端没有太多影响,能够将数据保留很长时间。
因而 cookie 中适宜存储须要长时间保留的数据,但对安全性要求不高。
3、浏览器对 cookie 的大小和个数都有限度,个别举荐每一个站点给浏览器发送的 cookie 数量不超过 20 个,每一个 cookie 的大小不超过 1kb。
Cookie 的利用:实现购物车、记住用户名、30 天内主动登录等。
session 的特点
1、session 是将会话中产生的数据保留在 服务器端,是服务器端技术
2、session 将数据存在服务器端的 session 对象中,绝对更加的平安,而且更加稳固。不容易随着用户的操作而导致 session 中的数据失落或者是被窃取。
但 session 是服务器端的对象,在并发量较高时每一个浏览器客户端在服务器端都要对应一个 session 对象,占用服务器的内存空间,影响效率。
因而 session 中适宜存储对安全性要求较高,但不须要长时间保留的数据。
Session 的利用:保留登录状态、保留验证码