一次会话:可以简单的理解:打开一个浏览器,访问某一个站点,在该网址内部查看信息,
点击超链接等相关的操作,最后关闭浏览器的整个过程,称之为一次会话.
HTTP协议特点:
无状态连接.服务端不知道上一次是哪一个客户端请求了自己.
无状态连接带来的问题:
在一次会话中,我们可以查看多个资源,每一个资源都会先发送请求,再响应,每次的请求都是客户端发出的.
但是,HTTP是无状态的,它不知道上一次是谁请求了自己.
也就是说,在一次会话中,多个请求之间无法共享数据,无法跟踪用户的会话信息.
Cookie是一个客户端技术,该技术是把会话的信息,存储到客户端,当客户端访问网站中的资源时,该客户端就会携带该Cookie信息,一起来访问网站,网站就可以从客户端的Cookie获取到会话信息
- 创建Cookie对象
Cookie c = new Cookie(String name,String value); - 把Cookie发送给客户端
resp.addCookie©;
注意:Cookie信息中不能存有中文
修改Cookie的值:只能发生一个同名称的新的Cookie,把原来的Cookie在客户端覆盖
cookie使用:
1:获取Cookie信息
Cookie[] cs = req.getCookies();
注意:空指针异常
2:取出Cookie中的信息
cookie.getName(); 获取当前cookie的名称
cookie.getValue(); 获取当前cookie的值
3、Cookie的分类(会话Cookie和持久化Cookie)
会话Cookie:该Cookie仅在当前这次会话中有效(浏览器关闭后,Cookie无效了)
持久Cookie:该Cookie在某段时间内有效(跟会话次数无关)
4、关键方法:cookie对象.setMaxAge(int seconds);
seconds > 0: 持久Cookie
seconds = 0: 删除该Cookie
seconds < 0: 会话Cookie
5、Cookie的缺陷,引出Session:
1):多个人使用同一台电脑的时候,可以查看浏览器的Cookie,不安全.
2):Cookie存储中文比较麻烦(得编码,再解码).
3):Cookie的value是String类型,一个Cookie就只能存储一个数据,如果需要存储多个数据,就得写N个Cookie.
4):一个站点对Cookie有限制:
Cookie大小限制在4KB之内;
一台服务器在一个客户端最多保存20个Cookie;
一个浏览器最多可以保存300个Cookie;
session
Session技术:本身Session的意思就是会话,表示一次会话,
和Cookie对比,Session是把会话的信息存储到服务器中,然后给以客户端一个存储的凭证,客户端拿到这个凭证后,以后访问该网站时通过该凭证,拿到会话的信息
1:获取当前客户端的Session对象
HttpSession session = req.getSession();
获取当前客户端对于的session对象,如果没有马上创建新的session并返回
2:往session中存入数据
session.setAttribute(String name, Object obj);
3:取出session中的数据
Object obj = session.getAttribute(String name);
4:删除Session(用户注销登陆).
-
删除Session中指定属性名的值.session对象.removeAttrbute(“currName”);
-
销毁Session对象(Session中所有的属性都不存在).session对象.invalidate();
5.Session的超时管理
- 在超时时间之内,如果客户端和服务端没有交互(用户的两次操作之间不能超过该时间),则自动的销毁Session.
- session对象.setMaxInactiveInterval(60 * 10);//超过10分钟,销毁Session.
- Tomcat服务器的默认超时时间为:30分钟,Tomcat一般在20多分钟就销毁了.
6、Session:session的生命周期是一次会话时间(默认cookie会话cookie)
TCP三次握手,连接一断就结束生命周期
7、Session技术底层依靠了Cookie,该Cookie也是一个会话Cookie
注意点:
- 一般的,我们存储到Session中的属性名称,要唯一,我们习惯XXX_IN_SESSION:
session对象.setAttribute(“USER_IN_SESSION”,“bunny”); - 若需要把多个数据存放到Session中,就得调用setAttribute方法N次,可以的.
一般的,我们把需要存储的数据,封装成一个对象,然后在存储到Session中. 把用户的信息,封装到user对象.
session对象.setAttribute(“USER_IN_SESSION”,user对象); - 如果多台服务器之间需要共享Session,此时Session中的对象,必须实现java.io.Serializable(才能在网络上传输).
序 列 化: 把对象信息存储为二进制.
反序列化: 把二进制信息恢复成对象.
public class User implements java.io.Serializable{…} - Session是一种特殊的Cookie,而浏览器可以禁用Cookie. 此时,需要在每一个资源之后,手动的携带session的ID.
/session/list;jsessionid=地址 String url =
response.encodeURL("/session/list");自动的在资源之后拼接;jsessionid=地址
#注意:开发中都不会取消接受Cookie的.