javaweb 学习笔记 session与cookie会话技术

创建时间
Session 域是当一个浏览器访问服务器时创建,关闭服务器或过期时,销毁Session域。
请求时,在servlet中主动将数据保存在Cookie中,Cookie是浏览器当中的一个缓存区域。在结算请求时,将浏览器中存放的数据发送到服务器。

Cookie

创建Cookie

Cookie cookie=new Cookie("key","value");

响应给浏览器

response.addCookie(cookie);

默认情况下,Cookie 是会话级别,即打开浏览器,关闭浏览器为一次会话,如果不设置持久化时间,那么Cookie会存在浏览器内存中,浏览器关闭,Cookie内容销毁。

设置Cookie在客户端的存储时间

cookie.setMaxAge(int second);
// 设置时间为秒
// 如果设置持久化时间,Cookie 信息会被持久化到浏览器的磁盘文件中,过期会自动删除

设置Cookie的携带路径
如果不设置携带路径,默认情况下访问创建cookie的web资源相同的路径都携带cookie信息

// 访问服务器下部署的所有工程都会携带cookie
cookie.setPath("/");
// 访问指定工程时都会携带cookie信息
cookie.setPath("/Project");
// 只有访问cookieServlet才携带cookie信息
cookie.setPath("/Project/cookieServlet");

删除cookie信息

// 如果想要删除客户端已经存储的cookie信息,使用同名路径的持久化时间为0的cookie进行覆盖即可
Cookie cookie = new Cookie("key", "value");
cookie.setMaxAge(0);
response.addCookie(cookie);

获取指定cookie信息

// 取出所有cookie信息
Cookie[] cookies = request.getCookies();
// 取出cookie信息中的name
String name = cookie.getName();
// 取出cookie信息中的value
String value = cookie.getValue();

Session

Session 技术是将数据存储在服务器端的技术,会为每个客户端创建一个内存空间存储客户的数据。客户端需要每次都携带一个标识ID去服务器中找属于自己的内存空间。Session 需要借助于Cookie 去存储客户端的唯一标识SESSIONID。
每一个用户访问服务器时,会给用户分配他们对于的存储空间,并且创建的存储空间有一个SESSIONID。第一次访问时会把对应的SESSIONID以Cookie的形式写给浏览器,下次再访问时,会携带SESSIONID找到当初创建的存储空间,在对应的存储空间当中取出数据。

获取Session对象

HttpSession session = request.getSession();
// 如果服务器没有该会话的Session对象,会创建一个新的Session返回。
// 如果已经有了属于该会话的Session,直接将已有的Session返回。
// 本质就是根据SESSIONID判断客户端是否在服务器上已经存在session了。

Session当中存/取数据
Session对象也是一个域对象,他也跟servletContext和request一样,有setAttribute,getAttribute,removeAttribute。

// 存数据
session.setAttribute("key", "value");
// 取数据
session.getAttribute("key");
// 删除数据
session.removeAttribute("key");

Session 的生命周期
创建: 第一次执行request.getSession时。
销毁: 1. 服务器关闭时。 2.session 过期/失效。 3.手动销毁 session.invalidate
作用范围: 默认在一次会话中,任何资源公用一个Session对象。

JSESSIONID 持久化
默认情况下,第一次获取session对象时,会帮你创建一个session,可以获取该sessionid,会自动将id写入到cookie中。
当把浏览器关闭时,再次获取数据时,发现找不到了。是因为访问的时候要求带着JSESSIONID,由于默认情况下,存储cookie时会话级别的,关闭浏览器,cookie就没有了。所以再次打开浏览器,访问资源时,没有JSESSIONID,就会创建一个session,就取不到以前在session中存取的数据了。
解决办法
在写数据时,自己手动把session中的JSESSIONID写到cookie中,然后设置持久化时间和路径,路径与浏览器自动创建的路径一致。

Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setPath("/Project");
cookie.setMaxAge(60);
response.addCookie(cookie);

你可能感兴趣的:(Java,Web)