会话就是在一个网站访问开始到一个网站访问结束直接的整个过程称之为会话。
因为在整个会话过程中需要有一些重点的数据进行存储。如果没有会话技术那么这些信息是无法进行存储的。
在以上的购物网站访问过程中需要将用户的购买的每一个商品的ID存储在会话中,以便在结算的页面那种获取到购买商品的价格信息。即:可以使用会话技术存储会话数据。
Cookie技术主要是一种使用客户端存储技术来记录会话中需要记录的数据。该数据由服务器创建和发送给浏览器,浏览器使用缓存文件技术将信息以文件的方式进行本地存储。当下一次需要改数据的时候,浏览器在发送请求的时候会自动携带该数据文件提交给服务器。
1 常用的API
创建Cookie对象
Cookie(String name, String value) 以指定数据创建Cookie对象
设置Cookie对象
void setMaxAge(int expiry) 设置Cookie的最大有效时间 void setPath(String uri) 设置Cookie的有效路径 void setDomain(String pattern) 设置Cookie的有效域
发送Cookie对象
void addCookie(Cookie cookie) 发送Cookie对象
获取Cookie对象
Cookie[] getCookies() 获取用户请求中的Cookie数组
获取Cookie中携带信息
int getMaxAge() 获取Cookie的最大有效时间 String getName() 获取Cookie的名字 String getValue() 获取Cookie存储的值 String getDomain() 获取Cookie的有效域 String getPath() 获取Cookie的有效路径
Cookie的写和读
1. 写Cookie
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { // 创建Cookie对象 Cookie cookie = new Cookie("name","jack"); // 设置Cookie对象 cookie.setMaxAge(5*60); // 发送Cookie对象 response.addCookie(cookie); }
Tomcat使用Set-Cookie: name=jack; Expires=Wed, 16-Jan-2014 06:42:34 GMT响应头信息发送给浏览器一个Cookie对象。
打开浏览器在缓存文件夹中发现一个文件,打开如下
name Cookie名 jack Cookie值 localhost/ 网站的路径 1536 Cookie的标识 1537 2856724736 30274484 4152152032 30274483 * 结束标记
2. 读Cookie信息
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { // 获取Cookie数组对象 Cookie[] cookies = request.getCookies(); // 循环 for(Cookie cookie:cookies){ // 获取Cookie数据 System.out.println(cookie.getName()); System.out.println(cookie.getValue()); System.out.println(cookie.getMaxAge()); System.out.println(cookie.getPath()); System.out.println(cookie.getDomain()); } }
浏览器发送读取请求的时候默认带有效的Cookie,以Cookie: name=jack请求头带Cookie数据,那么服务器端就可以直接进行数据的获取。
name 获取Cookie名 jack 获取Cookie值 -1 获取的有效时间 -1代表浏览器关闭的时候销毁该Cookie null null
浏览器不会将过期的Cookie对象发送给服务器。
3 读和写多个Cookie
如果给客户端输出多个Cookie对象,那么服务器会创建多个
Set-Cookie: name=jack; Expires=Wed, 16-Jan-2014 07:02:01 GMT
Set-Cookie: password=root; Expires=Wed, 16-Jan-2014 07:02:01 GMT头字段进行Cookie的发送。
多个Cookie在浏览器缓存中以一个文件的形式进行存储。
浏览器使用一个Cookie: name=jack; password=root带多个Cookie数据。
4 Cookie有效路径
以上的代码在第一次写回Cookie后,如果后面继续请求该网站的其他资源,那么还会继续携带Cookie对象直到Cookie过期。但是如果访问不同网站那么不带该Cookie。
cookie2.setPath("/read");
Set-Cookie: password=root; Expires=Wed, 16-Jan-2014 07:25:06 GMT; Path=/day08/read
存储的时候由于两个Cookie的有效路径不同,因此存储在不同的Cookie文件中。
但是指定有效路径的Cookie文件中多了有效路径的值。
password
root
localhost/read
但是如果现在需要在不同的网站中传递Cookie对象,那么如何指定有效路径。
cookie2.setPath("/"); ->指定Cookie的有效路径是tomcat的webapps目录
5 Cookie的跨域
假定A服务器上发布一个网站叫CMS系统,域名www.sina.com.cn
在CMS系统中可以直接编写一个写Cookie的Servlet。但是要设置该Cookie的有效域。
cookie.setDomain(“.163.com”);
假定B服务器上发布一个网站叫IT系统,域名www.163.com
编写一个获取Cookie数据的Servlet进行Cookie的数据读取。
总结: