会话的定义
在说明cookie之前,我们需先了解会话的概念。
会话指的是从浏览器发送给服务器的第一次请求开始,直至访问服务器结束,浏览器关闭,这期间浏览器与服务器之前产生的所有请求及响应称之为一次会话。
在一次会话期间,总是会产生许多数据,而有些数据是需要我们保存起来的,那么如何保存这些数据呢?
举例:
1.在登录的情况下去淘宝买东西,将商品加入到购物车中,那么如何记录这个商品保存在购物车中的信息呢?(保存到数据库中)
2.在未登录的情况下在淘宝买东西,将商品加入到购物车中,这时因为没有登录,所以无法将数据保存到数据库中。
这个时候就可以将数据保存到cookie或session中
如何将数据保存到cookie或session中?
cookie的工作原理
1.cookie是将会话的数据保存到客户端,是客户端技术。
2.cookie是基于两个头进行工作的:分别是Set-Cookie响应头和Cookie请求头
3.通过set-Cookie响应头将会话中产生的数据保存到cookie中,并将其保存在客户端,当客户端再次访问服务器时
通过cookie请求头获取到cookie中保存的数据。
cookie的API及应用
1.创建cookie对象
Cookie cookie=new Cookie(String name,Object value);
//创建cookie时需要指定cookie的key值及需要保存的value
2.将cookie放到响应中
response.addCookie(Cookie c);
//将cookie添加到响应中,由服务器将cookie发送到客户端,并由客户端保存,可多次调用,添加多个cookie
3.获取请求中的cookie数组对象
Cookie[] cookie=request.getCookies();
//获取请求中携带的所有cookie数组,如果请求中没有携带cookie则会返回null
4.删除cookie
//cookie没有提供直接删除的方法,但是可通过其他方法间接删除
//可以新创建一个cookie,cookie的名字与想要删除的cookie名字一致(因为浏览器是根据cookie的名字区分cookie,当传过去一个名字相同的cookie时,就会覆盖原cookie),这时再设置改cookie的最大存活时间为0,当浏览器接收到这个cookie后,会覆盖原cooki并立即删除
5.cookie的常用方法
cookie.getName();//获取cookie的名称
cookie.getValue();//获取cookie的值
cookie.setValue();//修改cookie中的值(cookie不能修改名称,因此没有setName)
cookie.setMaxAge();//设置cookie的最大存活时间
6.setMaxAge();设置cookie的最大存活时间
设置cookie的最大存活时间,时间单位是秒,如果没有设置cookie的最大存活时间,则默认cookie是一个会话级cookie(即存活时间只有一次会话,一次会话之后,cookie就会自动销毁),如果设置了该方法,则cookie就不会保存至浏览器的内存中,会持久化到硬盘中,当浏览器重新启动时会读取硬盘中cookie的信息。
代码示例:
Cookie cookie = new Cookie("cart",prod);//新建一个cookie对象
cookie.setMaxAge(24*60*60);//设置最大存活时间为24小时
response.addCookie(cookie);//将cookie添加到响应中
session的工作原理
1.session是将数据保存到服务端,是服务端技术
2.session是一个域对象,session中保存了一个map对象,往session中存储数据时,其实就是将数据保存到session的map中。
3.通过session的setAttribute()方法将数据保存到session中,通过getAttribute()方法将数据从session中取出。
sessin是一个域对象
获取session对象
request.getSession();//如果服务器中存在该浏览器对应的session对象,则返回,如果没有则新建一个session对象
session对象是一个域对象,因此session也提供存取数据的方法
session.setAttribute();//将数据存到session对象中
session.getAttribute();//将数据从session对象中取出
session的三大特征
1.生命周期
创建session:第一次调用request.getSession()方法会创建一个session对象。
销毁session:
1)超时销毁,一般默认超过30min没有访问session对象,session就会自动销毁(超时时间可修改,但不推荐)
2)自杀,调用session的invalidate方法会立即销毁session
3)意外身亡,当服务器非正常关闭时,(例如断电,崩溃,内存泄漏等),session会随着服务器的关闭而销毁。
当服务器正常关闭时,服务器会将内部的session对象序列化后保存到服务器的work目录下,变为一个文件,这个过程叫做session的钝化(序列化),当服务器重启时,钝化的session对象会再次回到服务器中变为对象,这个过程称之为session的活化(反序列化)
2.作用范围
再一次会话期间获取到的都是一个session对象
3.主要功能
在整个会话期间实现数据共享
总结,两者的区别
Cookie和Session都是会话级技术,都可以保存会话中的数据,但是由于两者的工作原理及特点不同,应用场景也不同。
cookie的特点:
1.cookie是将数据保存在客户端,是客户端技术。(js可以直接访问cookie)
2.cookie数据容易随着用户的操作,导致数据丢失或窃取。因此cookie中的数据既不稳定,也不安全
3.cookie是将数据可以保存在客户端,对服务端没有什么影响,可以存储较长时间。
4.浏览器对存储的cookie的大小及个数都有限制,一般推荐每一个站点存储的cookie不超过20个,每个cookie大小不超过1kb
5.总结:cookie适合存储需要存储时间较长且对安全性要求不高的数据。
6.cookie的应用:购物车,记住用户名,30天内自动登录
session的特点
1.session是将数据保存到服务端,是服务端技术。
2.session是将数据保存在服务端的session对象中,不会随着用户的操作丢失或被窃取。相对更加安全和稳定。
3.session存储在服务端,当并发量较高时,会占用大量服务器内存,影响效率。
4.总结:session适合存储对安全性要求较高但是存储时间不长的数据。
5.session的应用:保存登录状态,保存验证码等。
扩展:获取不到之前的session问题
session创建时会创建一个唯一的id用来代表这个session,称之为sessionid
session是基于cookie进行工作的,创建session时,服务器会创建一个cookie用来存放sessionid,然后把cookie保存到浏览器,
但是当浏览器关闭时,cookie就会销毁,浏览器再次打开时就无法找到之前的session了。
解决方法
当创建session时,我们手动创建一个cookie,指定这个cookie的名字为SESSIONID,将sessionid存储到这个cookie中,并设置cookie
的最大存活时间(即将cookie保存到硬盘中),当浏览器重启时就会读取硬盘中cookie的信息,从而获得sessionid后找到服务器中对应的session。