Cookie与Session的应用场景
Cookie和Session都是用于存储用户在网页上的信息.
应用区别是
Cookie将用户的信息存储在用户的硬盘上,
Session将用户的信息存储在服务器上,
因此Cookie用于存储用户的普通信息,
而Session用于存储用户的隐私信息(如密钥),和必须信息(如验证码).
Cookie与Session的区别
一.session存储数据在服务器端,Cookie在客户端
二.session没有数据大小限制,Cookie则有大小限制
三.session数据安全,Cookie相对于不安全
Cookie的概念
Cookie的概念不必我多说了吧,自行体会.
Cookie的应用
Cookie对象的创建与使用
步骤一:创建Cookie对象,并为其赋值(在cookie发起处)
格式:Cookie 自定义cookie对象名 = new Cookie("自定义cookie的键", "自定义cookie的值");
列如:
Cookie cookieObj = new Cookie("123321", "123321");
步骤二:将cookie对象作为参数来发送,以便共享cookie(在cookie发起处)
格式:response.addCookie(自定义cookie对象名);
列如:
response.addCookie(cookieObj);
步骤三:获取被共享的cookie,返回为一个带有键和值的集合(可以在cookie获取处,也可以在cookie发起处)
格式:Cookie[] 自定义Cookie键值集合结果名 = request.getCookies();
列如:
Cookie[] cookiesResult = request.getCookies();
for (Cookie cookie : cookiesResult) {
String cookiename = cookie.getName();
String cookieValue = cookie.getValue();
System.out.println("cookie的name为:"+cookiename+" cookie的value为:"+cookieValue);
注意点:cookie仅对当前浏览器有效,如果你先用谷歌浏览器缓存了cookie,那么换ie浏览器时不会有cookie效果.
应用一.发送多个cookie
在cookie发送处,可以一次发送多个cookie
步骤也非常简单,要发送多少个cookie,就new多少个cookie对象和调用多少个response的addCookie方法
但获取处只需要调用一次request的getCookies方法,毕竟它本质是个集合,集合就是用于容纳多个cookie的键和值.
应用二.设置生命周期
所谓cookie的生命周期,就是指当浏览器将cookie文件缓存到了硬盘后,会存在多长时间.
比如当你登录了一个网页勾选了自动登录,那么可能今天还会就自动登录,明天就不会了.
方法:设置cookie的生命周期
注意:该方法是基于建立了cookie对象的前提上实现的
格式:自定义cookie对象名.setMaxAge(周期数值);
列如:
cookieObj.setMaxAge(60);/有效期为60秒
参数规则:
一.如果为正数
:表示cookie文件会保存到硬盘多久,单位为秒.
二.如果为负数
:表示一旦关闭浏览器,就会删除cookie文件
三.如果为零
:表示删除cookie缓存文件
默认为负数
应用三.cookie存储中文数据
cookie能不能存中文?
在tomcat 8 之前 cookie中不能直接存储中文数据。
* 需要将中文数据转码—一般采用URL编码(%E3)
在tomcat 8 之后,cookie支持中文数据。但特殊字符还是不支持,建议使用URL编码存储,URL解码解析
URL编码格式:String 自定义转换编码结果名 = URLEncoder.encode(String类型的欲编码内容,"utf-8" )
列如:
String timeEncode = URLEncoder.encode(formatResult, "utf-8");
URL解码格式: String 自定义URL解码结果名 = URLDecoder.decode(String类型的欲解码内容,"utf-8" );
列如:
String decodeResult = URLDecoder.decode(cookie.getValue(),"utf-8" );
应用四.cookie数据共享规则
所谓cookie的数据共享,其实就是response对象的addCookie方法所发送的cookie对象.
一.cookie默认的
共享数据仅限于当前web模块中.
比如我的web模块名字叫’day3’.
那么该web模块下的http文件,或者java文件就可以获取该cookie.
二.可以通过方案,让不同web模块间,实现cookie的数据共享
就是说,我有两个web模块,一个名字叫’day3’,一个名字叫’day4’.
day3中的某个文件发送cookie对象,此时默认只能day3自己用,但是也有方案可以让day4也能通过request对象的getCookies方法获取该cookie对象.
设置不同web模块间的数据共享范围:
格式:自定义cookie对象名.setPath("共享的起始虚拟路径");
列如:
cookieObj.setPath("/");
三.可以通过方案,在不同服务器间实现cookie的数据共享
是的,不同服务器间的cookie也能实现共享,
但是有一个条件,那就是这两台服务器必须都属于相同一级域名下的二级域名
比如百度贴吧的域名为’tieba.baiidu.com’,百度新闻的域名为’news.baidu.com’
当我在百度贴吧登陆了百度帐号后,在百度新闻这个页面同样会显示我登陆了这个账号.
这是因为它们两个都属于同一个一级域名下.
而这个一级域名就是’baidu.com’.二者各自的二级域名分别为’news(news.baidu.com)‘和’tieba(tieba.baidu.com)’.所以他们之间可以实现cookie的数据共享.
设置不同服务器间的数据共享范围:
格式:自定义cookie对象名.setDomain("一级域名");
列如:
cookieObj.setDomain(".baidu.com")
Session的概念原理
Session其实被包含在Cookie中,因此其本质是依赖于Cookie的
session的特点
一,session用于存储一次会话的多次请求的数据,存在服务器端
二session可以存储任意类型,任意大小的数据
Session的应用
Session的对象创建(发起处)
步骤一:通过request对象创建Session对象(在Session发起处)
格式:HttpSession 自定义session对象名 = request.getSession();
列如:
HttpSession sessionObj = request.getSession();
步骤二:为session设置键和值,并自动发起数据共享(在Session发起处)
格式:自定义Session对象名j.setAttribute(自定义String类型的Session共享数据名称,自定义任意类型的Session数据内容 );
列如:
sessionObj.setAttribute("sessiontest","11111111111111" );
Session的数据获取(获取处)
步骤一:通过request对象创建Session对象(在Session获取处)
格式:HttpSession 自定义session对象名 = request.getSession();
列如:
HttpSession session = request.getSession();
步骤二:通过session对象获取指定的Session共享数据(在Session获取处)
格式:Object 自定义数据接收名 = 自定义session对象名.getAttribute("自定义欲获取的Seesion共享数据名称");
列如:
Object sessiontest = session.getAttribute("sessiontest");
问题一:客户端关闭后的数据异常
问:当客户端关闭后,服务器不关闭,那么两次获取session是否为同一个?
答:默认情况下并非为同一个Session。
解决方案:
如果需要相同在服务器不关闭的情况下,客户端关闭后仍然获取得到同一个Session的话,则需要创建Cookie对象,并将其Cookie的键’置为JSESSIONID,值设置为Seesion的标识符(ID)
随后为Session设置存活时间
解决步骤一:创建Cookie对象,并将Seesion的键和标识符(ID)作为Cookie对象的数据.
格式:Cookie 自定义Cookie对象名 = new Cookie("JSESSIONID",自定义Session对象名.getId());
列如:
Cookie c = new Cookie("JSESSIONID",session.getId());
解决步骤二:通过Cookie对象设置最大存活时间,让cookie持久化保存目标Session数据.
格式:自定义Cookie对象名.setMaxAge(60*60);
列如:
c.setMaxAge(60*60);
解决步骤三:将该包含有Session数据的Cookie进行数据共享,以让其生效.
格式:response.addCookie(自定义Cookie对象名);
列如:
response.addCookie(c);
问题二:服务器关闭后的数据异常
问: 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
答:不是同一个Session,
解决步骤:
为了要确保数据不丢失,需要完成以下二个操作
操作一.session的钝化:
在服务器正常关闭之前,将session对象系列化到硬盘上
操作二session的活化:
在服务器启动后,将session文件转化为内存中的session对象即可。
解决方案(自动):
一
.在手动使用tomcat部署WEB项目的情况下,
tomcat可以自动完成’钝化’和’活化’这两个步骤.
二
.而在通过idea集成tomcat来部署web项目的情况下,
因为idea会自动删除临时部署目录下的’work’目录,这样一来,连同钝化信息都会被一起删除.所以idea并不能自动完成’钝化’和’活化’这两个步骤.
不过大可放心的是,将来我们在实际操作中,一定是在服务器中手动使用tomcat部署web项目的,到时候’钝化’和’活化’这两个步骤都将由tomcat自动完成完成以下工作
问题三:结束Seesion的生命周期
结束方案一:非正常关闭服务器,如强制结束Tomcat,电脑重启
结束方案二:通过Session对象的invalidate()方法结束
格式:自定义Session对象名.invalidate();
列如:
session.invalidate();
结束方案三:默认生命周期为30分钟,等待三十分钟即可
结束方案四: 修改Session的默认生命周期
方式一 Tomcat手动部署的情况下修改默认生命周期:
打开Tomcat目录中,conf子目录下的配置文件’web.xml’,修改’session-timeout’标签.
方式二 在IDEA集成情况下修改默认的生命周期
在’web’目录中,'WEB-INF’子目录下创建’web.xml’配置文件,
通过在配置文件中添加’session-timeout’标签来修改