会话技术
因为 Http 协议是无状态的, 也就是说每个客户访问服务器端资源时, 服务器并不知道该客户端是谁, 所以需要会话技术识别客户端的状态会话技术是帮助服务器记住客户端状态(区分不同的客户端)
从打开一个浏览器访问某个站点, 到关闭这个浏览器的整个过程, 成为一次会话会话技术就是记录这次会话中客户端的状态与数据的
会话技术分为 Cookie 和 Session:
Cookie: 数据存储在客户端本地, 减少服务器端的存储的压力, 安全性不好, 客户端 可以清除 cookie
Session: 将数据存储到服务器端, 安全性相对好, 增加服务器的压力
一 Cookie 技术
Cookie 技术是将用户的数据存储到客户端的技术
1 设置 cookie
- Cookie cookie = new Cookie("username","x5456"); // 创建 cookie 对象
- cookie.setMaxAge(10*60); // 设置 cookie 有效期为 10min, 默认是到浏览器关闭时, 设置为 0 清除 cookie
- cookie.setPath("/web16"); // 设置 cookie 携带路径, 默认会将整个 web 应用 (/WEB16) 戴上 cookie
- response.addCookie(cookie); // 将 cookie 中存储的信息发送到客户端
注意: 如果不设置持久化时间, cookie 会存储在浏览器的内存中, 浏览器关闭 cookie 信息销毁(会话级别的 cookie), 如果设置持久化时间, cookie 信息会 被持久化到浏览器的磁盘文件里
cookie 只能存除中文的字符串
2 获取指定的 cookie
cookie 信息是以请求头的方式发送到服务器端的
- Cookie[] cookies = request.getCookies(); // 获取 cookie 列表
- for (Cookie cookie: cookies) { // 遍历 Cookie 数组, 通过 Cookie 的名称获得我们想要的 Cookie
- if (cookie.getName().equals("username")) {
- String cookieValue = cookie.getValue();
- System.out.println(cookieValue);
- }
- }
3 清除 cookie
- Cookie c = new Cookie("name", ""); // key 为要清除的 cookie
- c.setMaxAge(0);
- c.setPath("/WEB16"); // 路径要和之前一样
- response.addCookie(c);
二 Session 技术
Session 技术是将数据存储在服务器端的技术, 会为每个客户端都创建一块内存空间存储客户的数据, 但客户端需要每次都携带一个标识 ID 去服务器中寻找属于自己的内存空间所以说 Session 的实现是基于 Cookie,Session 需要借助于 Cookie 存储客户的唯一性标识 JSESSIONID
1 向 session 域中存取数据
session 也是一个域对象, 所以也可以用 get/set/remove 方法
- /*
- * request.getSession()方法内部会判断 该客户端是否在服务器端已经存在 session
- * 如果该客户端在此服务器不存在 session 那么就会创建一个新的 session 对象
- * 如果该客户端在此服务器已经存在 session 获得已经存在的该 session 返回
- */
- HttpSession session = request.getSession();
- session.setAttribute("name", "x5456"); // 设置 Session
- String JSESSIONID = session.getId(); // 获取 Session 对象的编号 id
- Cookie cookie = new Cookie("JSESSIONID", JSESSIONID); // 手动创建一个存储 JSESSIONID 的 Cookie, 为该 cookie 设置持久化时间
- cookie.setPath("/WEB16");
- cookie.setMaxAge(60 * 10);
- response.addCookie(cookie);
2 获得 Session 中的值
- HttpSession session = request.getSession(); // 获取域对象
- Object name = session.getAttribute("name");
- System.out.println((String) name);
Session 对象的生命周期
创建: 第一次执行 request.getSession()时创建
销毁:
1)服务器 (非正常) 关闭时
2)session 过期 / 失效(默认 30 分钟)
时间的起算点: 从不操作服务器端的资源开始计时
可以在工程的 web.xml 中进行配置过期时间
- <session-config>
- <session-timeout>30</session-timeout>
- </session-config>
3)手动销毁
session.invalidate();
作用范围:
默认在一次会话中, 也就是说在, 一次会话中任何资源公用一个 session 对象
来源: http://www.bubuko.com/infodetail-2499363.html