Cookie和Session
Cookie
- 作用: 解决了不同请求之间的数据共享
简介
-
Cookie常设置在 HTTP 头信息中设置了一个Cookie信息,如
-
Cookie原理是什么?由于HTTP协议是一种无状态的协议,服务器单从网络连接上无法知道用户身份。如何解决?有客户端给每个请求发一个通行证,每人一个,谁访问都需要带上通行证,这样服务器就可以确认身份了。这就是Cookie的工作原理。
特点
- 浏览器端的数据存储技术
- 类型: 会话cookie和持久cookie(会话cookie:存储在浏览器的内存中,浏览器关闭即失效。持久cookie:设置了cookie的有效期,存储在客户端硬盘中,计算机重启也会存在。)
3.默认的cookie信息存储好之后,每次请求都会附带,除非设置有效期。
4.安全属性,设置Cookie的secure属性为true后,浏览器只会在HTTPS和SSL等安全协议中传输此类Cookie。
5.cookie是不可跨域的
使用
//创建Cookie对象
//中文时这样设置,否则会出异常
String encode1 = URLEncoder.encode("老三","utf-8");
Cookie cookie = new Cookie("laosan",encode1);
Cookie cookie1 = new Cookie("nn","chifanle1");
//修改或者删除
//修改,创建一个同名的Cookie对象,传到浏览器即可
//删除,无法删除客户端的Cookie,但是可以设置这个cookie的有效期为0,即删除cookie
//设置cookie有效期,设置负数表示是临时性cookie,浏览器关闭则失效,设置为0表示即时失效
cookie.setMaxAge(300); //如300秒后过期,
//域名
//支持二级域名,如让qq.com下的wenxin.qq.com和music.qq.com都能使用的cookie可以设置域名
cookie.setDomain(".qq.com");
//路径
//设置路径,只让 /test/cookie 路径访问
cookie1.setPath("/test/cookie");
//安全属性,设置为true只有在安全协议下才会传输,如(HTTPS,SSL)
cookie1.setSecure(true);
//响应cookie到客户端,必须的
resp.addCookie(cookie);
resp.addCookie(cookie1);
- 注: cookie值是中文会报HTTP Status 500 - Control character in cookie value or attribute.
//中文时这样设置,否则会出异常
//编码
String encode1 = URLEncoder.encode("老三","utf-8");
Cookie cookie = new Cookie("laosan",encode1);
//获取时解码这样做
for (Cookie cookie2: req.getCookies()){
String value = URLDecoder.decode(cookie2.getValue(),"UTF-8");
System.out.println(cookie2.getName()+"===>"+value);
}
Session
- 作用:处理一个用户之间不同请求的数据共享
简介
- Session是一种基于cookie的记录客户状态的机制,常翻译成"会话"。
- 原理或者工作流程: 用户第一次访问服务器时,服务器会创建一个session对象给用户,并将该session对象的JSESSIONID使用cookie存储到浏览器中,在用户进行其他请求时将这个JSESSIONID传给服务器,这样就保证了用户的其他请求能够获取到同一个Session对象,也保证了不同请求能够获取到共享的数据。
特点
1.存储在服务器
2.服务器进行创建
3.依赖Cookie技术
4.默认存储时间是30分钟(在tomcat/conf/web.xml的session-timeout配置下设置)
5.作用域是一次会话(从浏览器打开访问服务器到浏览器关闭)
session失效场景
- session过期,默认30分钟,或者自定义设置的时间后失效
- 浏览器关闭,session没有过期,但是浏览器存储在cookie的JSESSIONID会被清除,所有请求服务器时会重新获取session
- 服务器重启
使用
//创建session|获取session
//如果请求中有sessionId就返回对应的session,没有则创建新的对象
//如果session对象失效了,也会创建新的session对象
HttpSession session = req.getSession();
//获取SessionId
String sessionId = session.getId();
//设置session存储时间,秒,session对象会在有效期到达后失效
session.setMaxInactiveInterval(300);
//时间
//获取创建时间,返回毫秒数,从1970.1.1日开始到现在的毫秒数
long createTime = session.getCreationTime();
//获取客户端最后一次与服务器接触的时间,从1970.1.1日开始到现在的毫秒数
long lastAccesTime = session.getLastAccessedTime();
//获取最大不活跃时间间隔
long maxInactiveInterval = session.getMaxInactiveInterval();
//数据操作
session.setAttribute("laosi","老四");
String name = (String)session.getAttribute("laosi");
System.out.println(name);
//设置session强制失效
session.invalidate();
Session和cookie的比较
- cookie数据存储在客户端(浏览器),session存储在服务器上
- cookie没有session安全,别人可以解析本地存放cookie的文件
- session在一定时间内会保存到服务器上。当访问量增多,会比较占用服务器的性能,考虑减轻服务器的性能时,应使用cooKie.