会话,指的是web开发中的一次通话过程,当打开浏览器,访问网站地址后,会话开始,当关闭浏览器(或者到了过期时间),会话结束。
最常用的 回话。 就是购物车,当我们登录成功后,把商品加入到购物车之中,此时我们无论再浏览什么商品,当点击购物车时,那些加入的商品都仍在购物车中。
会话是操作 共享数据用的,并且是在不同请求间实现数据共享。要在多次请求间实现数据共享,就使用会话管理技术
客户端的会话 cookie
是客户端浏览器的缓存文件,里面记录了客户浏览器访问网站的一些内容。同时,也是HTTP协议请求和响应消息头的一部分
Cookie的属性
name cookie的名称; value cookie的值;
path cookie的路径; domain cookie的域名
maxAge cookie的生存时间;
version cookie的版本号
注意一下:Cookie有大小,个数限制。每个网站最多只能存20个cookie,且大小不能超过4kb。同时,所有网站的cookie总数不超过300个。
Cookie涉及的常用方法
向浏览器添加Cookie
public void addCookie(Cookie cookie);
从服务器端获取Cookie
public Cookie[] getCookies();
Cookie的Path细节:浏览器什么时候带给服务器,什么时候不带
//创建Cookie对象 通过指定的名称和值构造一个Cookie
- 创建后无法更改cookie的名称。
- 该值可以是服务器选择发送的任何内容。
Cookie cookie = new Cookie(“pathquestion”, “CookiePathQuestion”);
也就是说,"pathquestion"是这个cookie的名字,
"CookiePathQuestion"是cookie的值
创建之后,可以使用setValue方法更改cookie的值。
*/
public Cookie(String name, String value) {
validation.validate(name);
this.name = name;
this.value = value;
//设置cookie的最大存活时间
cookie.setMaxAge(Integer.MAX_VALUE);
//吧cookie发送到客户端
resp.addCookie(cookie);
把cooker发送到客户端,就是用 响应对象调用
addCookie(cookie),这里的参数是new出来的新 cookie。
//获取所有的的cookie
Cookie[] cookies = req.getCookies();
for ( int i = 0;cookies != null && i < cookies.length; i++) {
if (“pathquestion”.equals(cookies[i].getName())){
resp.getWriter().write(cookies[i].getValue());
return;
}
}
尤其强调 for 循环的 判断语句 for ( int i = 0;cookies != null && i < cookies.length; i++)
cookies != null 必须在这个位置,否册会报错
放松到 客户端 用response 响应对象,
获取就用 request 请求对象。
客户端什么时候带cookie到服务器,什么时候不带?
就是看请求资源URI和cookie的path比较。
请求资源URI.startWith(cookie的path) 如果返回的是true就带,如果返回的是false就不带。
服务端会话 HttpSesstion
它是Servlet规范中提供的一个接口
HttpSession接口的实现由Tomcat提供
它也是Servlet规范中四大域对象之一的会话域对象。并且它也是用于实现数据共享的。但它与应用域和请求域是有区别的。
HttpSesstion对象用于提供一种通过多个页面请求或访问网站来标识用户并存储有关该用户的信息的方法。
HttpSesstion简单说它就是一个服务端会话对象,用于存储用户的会话数据。
域对象
ServletContext—作用范围 整个应用范围
使用场景 当前项目中需要数据共享时,可以使用此域对象。
ServletRequest—作用范围 当前请求范围
使用场景 当前项目中需要数据共享时,可以使用此域对象。
ServletContext—作用范围 会话返回
使用场景 在当前会话范围中实现数据共享。它可以在多次请求中实现数据共享。
pageContext—作用范围 作用范围最小只能在当前页面
使用场景 当前项目中需要数据共享时,可以使用此域对象。
获取HttpSession
是通过HttpServletRequest接口中的两个方法获取的
public HttpSession getSession(boolean create);
public HttpSession getSession();
request.getSession(带参数);参数是boolean的
为true 没有自动创建—也是默认值。
false不自动创建,没有就返回null
HttpSession,它虽然是服务端会话管理技术的对象,但它本质仍是一个Cookie。是一个由服务器自动创建的特殊的Cookie,Cookie的名称就是JSESSIONID,Cookie的值是服务器分配的一个唯一的标识。
当我们使用HttpSession时,浏览器在没有禁用Cookie的情况下,都会把这个Cookie带到服务器端,然后根据唯一标识去查找对应的HttpSession对象,找到了,我们就可以直接使用了。下图就是我们入门案例中,HttpSession分配的唯一标识,同学们可以看到两次请求的JSESSIONID的值是一样的:
HttpSession的钝化和活化#
持久态 就是 HttpSession 的 钝化
把长时间不用,但还不到过期时间的HttpSession进行序列化,写到磁盘上。
HttpSession持久态也叫做钝化。(与钝化相反的,我们叫活化。)
HttpSession 的 钝化 在这两种情况下使用
第一种情况:当访问量很大时,服务器会根据getLastAccessTime来进行排序,对长时间不用,但是还没到过期时间的HttpSession进行持久化。
第二种情况:当服务器进行重启的时候,为了保持客户HttpSession中的数据,也要对HttpSession进行持久化
注意 HttpSession的持久化由服务器来负责管理。
只有实现了序列化接口的类才能被序列化,否则不行。