前言
HTTP协议是无状态协议,无状态就是每次发起的请求都是毫无关系的,没有任何的关联,这使得我们想要在每个请求或整个会话之间共享数据比较困难。所以就产生了会话技术Session 和 Cookie。
什么是会话
浏览器和服务器之间发生的一系列请求和响应的过程,通俗一点来说,就是从你开始访问一个网站,到你结束这个网站的访问,中间所有的请求与服务器的交流都可称作是一个会话。
你可以将数据放入session或cookie,以达到整个会话过程中数据共享。
Cookie的概述
Cookie就是保存在浏览器端的键值对数据,它的存活时间有限,不能识别一些特殊符号。
Cookie的创建
每个Cookie是以键区分的,如果设置同样键的Cookie,后面Cookie的值会覆盖前面的。
//cookie的创建
Cookie cookie = new Cookie("name","lglg");
//让response返回给浏览器保存
response..addCookie(cookie);
Cookie的获取
Request对象没有提供根据cookie的键获取cookie值的api。只能先通过获取cookie数组,然后迭代找到自己想要的Cookie.
Cookie[] getCookies() request获取浏览器发送的cookie
String getName()获取cookie的名称
String getValue() 获取cookie的值
-------------------------------------------
Cookie[] cookies = request.getCookies();
//循环所有的cookie
for(Cookie cookie:cookies){
System.out.println(cookie.getName()+" "+cookie.getValue());
}
Cookie有效期的设置
void setMaxAge(int expiry)
可以设置cookie的最大生存时间(单位:秒)
。
cookie.setMaxAge(0);//删除cookie
cookie.setMaxAge(-1);//有效期为当前会话
cookie.setMaxAge(60*60);//过期时间为1小时
Cookie的访问路径
每次http请求会将符合该次路径请求的cookie携带上,所以设置cookie的访问路径非常重要,默认是本项目产生的cookie,只会访问本项目的请求携带上。
//方式1:/myweb/ 当访问项目下的所有资源,请求都会携带Cookie
//方式2:/myweb/abc 当访问项目下的abc下所有资源,请求都会携带Cookie
//方式3:/ 当访问服务器中所有资源,请求都会携带Cookie
//默认方式:/myweb/ 当访问项目下的所有资源,请求都会携带Cookie
cookie.setPath(String uri)
设置cookie的路径——浏览器根据这个路径判断那些cookie要发送给服务器。
Cookie的删除
Cookie没有直接的删除方法,只能通过设置一些其他属性等效于删除的效果
//1.修改Cookie的存活时间为0
cookie.setMaxAge(0);
//2.可以使用空值覆盖原值
Cookie cookie = new Cookie("name","");
Cookie的编码
Cookie不能识别一些特殊符号,在gerCookies()的时候会出现数据丢失的情况,这些特殊字符有:空格,方括号,圆括号,等于号,逗号,双引号,斜杠,问号,@符号,冒号,分号等。对于这些数据需要先将他们进行URLEncoder编码,然后再解码。
编码: URLEncoder.encode(date, "UTF-8")
解码: URLDecoder.decode(date, "UTF-8")
----------------------------------------
String data = "@张三";
Cookie cookie= new Cookie("name",URLEncoder.encode(date, "UTF-8"));
response.addCookie(cookie);
-----------------------------
Cookie[] cookies = request.getCookies();//
if(cookies != null){
//循环所有的cookie
for(Cookie cookie:cookies){
if("name".equals(cookie.getName())){
//解码
String vaule = URLDecoder.decode(cookie.getValue(),"utf-8");
}
}
}else{
System.out.println("没有查询到cookie");
}
Cookie的域名与安全
Cookie不可跨域名,不同域名间不能使用同一个Cookie,如两个二级域名:www.hello.com和editor.hello.com。两者之间不能使用同一Cookie,要想使用需要使用setDomain()方法
//setDomain(String domain)
Cookie cookie = new Cookie("name","zhangsan");
cookie.setDomain(".hello.com");
cookie.setPath("/");
response.addCookie(cookie);
Cookie同样也是不安全的,可以使用Cookie的setSecure方法,浏览器只会在HTTPS和SSL等安全协议中传输此类Cookie。
Cookie cookie = new Cookie("name", "zhagnsan");
cookie.setSecure(true);
response.addCookie(cookie);