Cookie
会话
简单理解为用户打开一个浏览器 访问一个网站 点击多个超链接,通过点击链接访问网站的多个资源然后,关闭浏览器整个过程 称之为一次会话 会话模式常见两种客户端技术 Cookie 和服务器端技术 Session
客户端技术 Cookie
服务器把每个用户的数据以Cookie的形式 存储后 写回给用户各自的浏览器 当用户使用浏览器再去访问服务器中的web资源时就会带着各自特有的数据去 ,这样,web资源处理的就是用户各自的数据了
服务器端技术 Session
利用这个技术服务器在运行时可以为每一个用户的浏览器创建一个独享的Session对象 由于Session为用户浏览器独享 所以在用户访问web资源时 可以把各自的数据 存放在各自的Session中 当用户再去访问服务器的其他资源的时候 其他web资源再从Session中取出数据为用户服务
注意:重点内容要解决的问题是保存各个客户端自己的数据
Cookie:
特点:
1.一个Cookie拥有一个名称 一个值 和一些可选属性 比如路径 存活时间等等
2.Cookie只能存放Servlet发送到web浏览器的少量信息
3.注意Cookie只能存储字符串
name value 属性
name 名称 通过名称不能唯一确认一个Cookie 因为名字可相同 路径可能不同
value 值
path 路径
maxAge cookie的缓存时间 默认是-1 单位是秒
负数:cookie的数据存在浏览器缓存中 关闭浏览器 就失效
0:删除
正数:缓存(持久化到硬盘上)的时间
Cookie的创建
//创建Cookie
Cookie ck=new Cookie("code", code);
ck.setPath("/");//设置Cookie的路径
ck.setMaxAge(-1);//内存存储,取值有三种:>0有效期,单位秒;=0失效;<0内存存储
response.addCookie(ck);//让浏览器添加Cookie
Cookie的编码与解码(8.0版本及之前的版本存储中文需要编码和解码)
编码可以使用java.net.URLEncoder类的encode(String str,String encoding)
方法,解码使用java.net.URLDecoder类的decode(String str,String encoding)
方法
//web服务器tomcat:8.5之前的版本,存储中文:Control character in cookie value or attribute.
//可以对中文进行编码
String value = "尼古拉斯.赵四";
//编码操作
value = URLEncoder.encode(value, "utf-8");
System.out.println("编码后:"+value);
Cookie c = new Cookie("uname", value);
c.setPath("/");
c.setMaxAge(-1);
response.addCookie(c);
取:
Cookie[] cookies = request.getCookies();
if (cookies!=null) {
for (Cookie cookie : cookies) {
//cookie键
String key = cookie.getName();
String value = cookie.getValue();
if ("uname".equals(key)) {
System.out.println("解码前:"+value);
value = URLDecoder.decode(value, "utf-8");//解码
}
System.out.println(key+"-----"+value);
}
}
Session
它是一个域对象Request Session ServletContext 同一个会话下 可以使一个应用的多个资源共享数据 cookie技术是客户端技术 只能存储字符串 并且在客户端只能允许存储4k的数据 实际上存3k就满了 session技术 是服务端技术可以保存对象 session存储的数据量更大 更多 在B/S 交互中 需要存储大量数据时 可以使用session 这就是Session存在的原因
常用方法
void setAttribute(String name,Object value);
void removeAttribute(String name);
Object getAttribute(String name);
getId()
获取 session id
setMaxInactiveInterval(int interval)
设置session 的存活时间单位是秒 默认半个小时
invalidate()
使此次会话无效
Session失效的几种情况
1、超过了设置的超时时间
2、主动调用了invalidate方法
3、服务器主动或异常关闭
注意:浏览器关闭并不会让Session失效