总结31 WEB服务中,Cookie与Session的应用

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’标签来修改

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值