一、简介
常用的会话跟踪技术有cookie和session,Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。其中cookie分为:
- 会话Cookie:不设置过期时间,表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。会话cookie一般不存储在硬盘上而是保存在内存里。
- 持久Cookie: 设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在浏览器的不同进程间共享。
二、区别
区别 |
Cookie |
Session |
存放位置 |
Cookie存放在客户端浏览器中 |
Session存放在服务器中 |
大小限制 |
cookie的大小受限制,单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie |
session的大小一般不受限制 |
存放数据类型 |
String类型的一小段文本信息 |
Key-Value(Object类型) |
工作原理 |
客户端将cookie把数据存在在浏览器中,这样浏览器再次请求的时候就会带上这个cookie,浏览器就认识这个请求了。客户端第一次访问服务器的时候浏览器会在响应头中加上Set-Cookie 信息,当再次发送一个请求的时候,请求会在请求头上带上 Cookie:xxx ,也就是前面自己的数据,目的是让服务器认识自己。 |
服务器为每一次会话创建了一块内存区域来存在数据,第一次请求服务器把数据存放在了服务器中,服务器给客户端响应一个编号,下次再来请求的时候拿着这个编号在服务器的内存空间中可以找到自己的数据。 客户端浏览器第一次请求服务器,服务器会创建cookie对象并且把数据按照key-value的形式起来,然后在响应头中加上 Set-Cookie:xxx (这里的xxx其实就是sessionId),下一次访问的时候,会在请求头中加上 Cookie:xxx (实际上session是基于cookie实现的) |
缺点 |
1. 把数据存放在了浏览器中,浏览器都有一个可以查看cookie的选项,显然是有些不安全; 2. cookie的大小做限制; |
1. session会在一定时间内保存在服务器上,当访问增多,比较占用服务器的性能; 2.session会在会话结束后消失,也就是关闭浏览器或者关闭服务器session会失效; |
下面总结一些常用的API:
- cookie:
//创建cookie
Cookie cookie = new Cookie("cookieName","cookieValue");
response.addCookie(cookie);
//循环输出每一个cookie对象
Cookie[] cs = request.getCookies();
String cookieName = cookie.getName();
String value = cookie.getValue();
//创建cookie对象对属性的编码
Cookie cookie = new Cookie("cookieName",URLEncoder.encode(username,UTF-8));
//获取cookie中的数据对属性的解码
String value = URLDecoder.decode(cookie.getValue(),"UTF-8");
//方法1:设置相同名称的key,覆盖上一个,还要把获取的cookie对象添加到响应中
resp.addCookie(new Cookie("wsh","HHH"));
//方法2:调用setValue(); 此时还需要把对象重新加入到响应中
c.setValue("wsh");
resp.addCookie(c);
// 设置负数表示-会话cookie,缺省. 浏览器关闭cookie也就消失
c.setMaxAge(-1);
// 删除
c.setMaxAge(0);
//持久化cookie,设置cookie可以存活的时间是10s
cookiec.setMaxAge(10);
- session:
//获取session
HttpSession session = req.getSession();
//true(缺省) : 若当前请求中存在session对象,就直接返回,如果不存在就创建一个再返回
//false: 若当前请求中存在session对象,就直接返回,如果不存在返回null
HttpSession session = getSession(boolean create);
//设置属性,key的命名一般为大写
session.setAttribute(String key,Object value);
//获取属性对应的值
Object value = session.getAttribute(String key);
//删除对应的属性
session.removeAttribute(String key);
//销毁session对象
session.invalidate();
//一段时间内浏览器与服务器没有交互会自动销毁session对象
//30s
session.setMaxInactiveInterval(30);