什么是会话?
会话是浏览器和服务器之间的多次请求和响应,从浏览器访问服务器开始,到访问服务器结束,直到浏览器关闭为止,这期间产生的多次请求和响应加在一起就称为浏览器和服务器之间的一次会话。
简单的来说就如同打电话一样,从拨号、对方接听到挂断电话,两个人会进行多次的对话。
在一次会话中往往会产生一些数据,可以通过会话技术来保存会话中的数据。
Cookie技术将数据存储在客户端本地,减少了服务器端的存储压力,但安全性相对较弱,客户端可以清除Cookie;Session技术将数据存储在服务器端,安全性较高(下篇文章将会介绍Session)。
什么是Cookie?
Cookie是一种在客户端浏览器存储数据的一种会话技术。浏览器根据用户访问的服务器所作出的响应,可以在用户本地保存一小段文本信息,用来记录跟用户相关的信息。
当用户第一次访问服务器时,服务器端检测到访问请求中并未携带Cookie信息,就会通过HTTP响应头向客户端发送一个Cookie,以便浏览器下一次访问服务器时能够识别客户端。服务器端通过增加Set-Cookie头字段来给客户端发送Cookie,头字段的格式如下:
Set-Cookie:JSESSIONID=7DCF398AACD21762838311E4FAC37184;Path=/ch06_demo;
JSESSIONID表示Cookie的名称;7DCF398AACD21762838311E4FAC37184表示Cookie的值;Path表示Cookie的路径属性。
当用户后继访问服务器时,浏览器会将服务器存储在本地的Cookie通过请求头发送给服务器。
请求头字段格式如下:
Cookie:JSESSIONID=7DCF398AACD21762838311E4FAC37184
如果有多个Cookie,每个键值对之间用分号隔开。
注意:服务器不是在浏览器第一次访问服务器时才向客户端发送Cookie,而是每一次响应都可以向客户端发送Cookie。
Cookie中API:
创建Cookie
通过Cookie类的构造方法可以创建一个Cookie,构造方法如下:
public Cookie(String name,String value)
参数name用于指定Cookie的名称,参数value用于指定Cookie的值。
读取Cookie
服务器端通过request.getCookies()方法来获取客户端发送的所有Cookie,该方法返回的是Cookie数组。
Cookie[] cookies=request.getCookies();
for(int i=0;i<cookies.length;i++){
if("title1".equals(cookies[i].getName()){
String v=URLDecoder.decode(cookies[i].getValue());
System.out.println(cookies[i].getName()+":"+v);
}
}
删除Cookie
要删除客户端的Cookie,需要创建一个值为空的同名的Cookie发送到响应端,同时使用setMaxAge()方法将Cookie的有效期设置为0。
Cookie cookie=new Cookie("title","");
cookie.setMaxAge(0);
response.addCookie(cookie);
Cookie的有效期
Cookie的有效期是通过setMaxAge()方法来设置的,其参数是一个整数,含义如下:
- 如果参数为正数,浏览器会把Cookie写到硬盘中,只要还在有效期内,访问网站时该Cookie就有效,不论是否关闭浏览器或电脑。
- 如果参数为负数,Cookie是临时性的,仅在本浏览器内有效,关闭浏览器后Cookie就失效了,Cookie不会写到硬盘中。Cookie默认值就是-1。
- 如果参数为0,则表示删除该Cookie。
Cookie的域名和路径
Cookie的隐私安全机制决定Cookie是不可跨域名的。
比如www.baidu.com和www.google.com之间的Cookie是互不交换的。即使是一级域名相同,不同的二级域名也不能交换,比如www.goole.com和www.image.goole.com的Cookie也不能互相访问。
Cookie还有一个path属性表示Cookie的路径,可以通过setPath()方法来设置。如果不设置Cookie的path,Cookie的路径就是请求的路径。子路径可以访问父路径下的Cookie,但父路径不可以访问子路径下的Cookie。