会话跟踪技术cookie、session

参考文章:https://blog.csdn.net/londa/article/details/94838127

http协议是无状态的

web技术发展初期都是静态页面,不需要记住前后两次请求的关系,即http协议是无状态的,前后两次请求没有关联

  • 为什么需要会话跟踪技术
    现在web动态页面很多时候需要记住之前请求的状态,即需要有状态,比如需求知道用户是否已经进行登录操作,于是出现了维持状态的会话跟踪技术:cookie、session

会话:一次会话包含多次请求和响应
一次会话:浏览器第一次给服务器发送请求,会话建立,直到浏览器关闭或服务器关闭,会话结束
会话技术的主要作用:在一次会话返回内,多次请求之间共享数据
会话技术在java中主要分为两类:

  • 客户端会话技术cookie:cookie是将数据保存中浏览器客户端的
  • 服务器端会话技术session:session是将数据保存翟服务器端的

浏览器端会话技术Cookie

浏览器客户端第一次请求服务器时,服务器端创建cookie,绑定数据后通过响应发送cookie到浏览器客户端,浏览器收到cookie后存储在本地,下次请求时将cookie又带回服务器
cookie是基于响应头的Set-Cookie属性和请求头Cookie属性实现的

服务器返回cookie详解

服务器创建cookie后返回浏览器客户端时,将cookie的数据放在http请求之响应头的Set-Cookie属性
在这里插入图片描述

浏览器传cookie回服务器详解

浏览器传cookie回浏览器时将cookie数据放到http请求之请求头的Cookie属性中,响应头就不会再带cookie信息了
在这里插入图片描述

Cookie共享问题

  • 同一个域名
    一个Tomcat中部署了多个项目,默认情况下cookie不能共享,但可以通过cookie对象的方法进行设置。默认情况下,path为当前项目的虚拟目录,如果要共享,可以设置虚拟目录为 /,所有在根目录下的项目都可以共享cookie
Cookie对象.setPath(String path); 
Cookie对象.setPath("/"); //所有在根目录下的项目都可以共享cookie
  • 跨域:不同域名之前的cookie共享问题
    如果Cookie对象.setDomain(".baidu.com"),那么www.baidu.com、news.baidu.com、music.baidu.com之间即可共享域名,它们都是baidu.com的子域名【切记必须以小数点开头:.baidu.com
Cookie对象.setDomain(Sring domain)

Cookie的特点

  • cookie的数据存在浏览器
  • 浏览器对单个cookie的大小有限制,一般为4kb(不同浏览器存在差异),并对同一个域名下cookie的数量也有限制(一般20个以内)
    在这里插入图片描述
    cookie的应用场景:
  1. 存储少量的不太敏感的数据
  2. 在不等录的情况下,完成服务器器对客户端身份的识别

Cookie的结构

cookie是以键值对形式存储数据的,但不是Map,一个cookie只能有一个键值对,因为数据是存储在cookie对象的name属性、value属性中的

    private final String name;
    private String value;
      public Cookie(String name, String value) {
        validation.validate(name);
        this.name = name;
        this.value = value;
    }

Cookie常见问题

一次可不可以发送多个cookie?
可以,创建时可以同时创建多个cookie,添加到响应中一次返回;请求时,一次也可以带多个cookie返回服务器
cookie在浏览器中保存多久?
(1)默认情况下cookie数据存储在内存中,浏览器关闭后,cookie被销毁
(2)持久化存储【设置过期时间】 cookie对象.setMaxAge(int seconds)
参数为整数:将cookie中的数据持久化存储到硬盘中,指定时间后销毁
参数为负数:cookie数据存储在浏览器内存中,浏览器关闭后cookie数据销毁
参数为0:删除浏览器中的cookie,因为服务器不能直接删除浏览器中cookie,只能通过设置过期时间为0来实现
cookie中可以存储中文吗?
Tomcat8之前cookie中不支持中文,需要将中文转码,一般采用URL编码
Tomcat8及之后版本cookie支持中文,但仍不支持特殊字符,采用URL编码:

//编码
String newStr = URLEncode.encode("字符串","utf-8")
//解码
String newStr = URLDecode.decode("字符串","utf-8")

服务器端会话技术:session

  • 在一次会话返回内,多次请求之间共享数据,session的数据是存放在服务器端的
  • Session可以存储任意类型、任意大小的数据

Session的创建

session不是一打开网站就会立刻建立,创建session需要满足以下两个条件中的任意一个条件:
(1)后台服务器端调用HttpSession session = request.getSession()进行创建
(2)用户第一次访问jsp页面就会创建session,因为jsp默认会调用session = pageContext.getSession();

 //下面两个功能相同,当请求对象中没有session时,会创建session
HttpSession session = request.getSession();
HttpSession session = request.getSession(true);    

//下面这个方法,当请求对象中没有session时,返回null,不会创建session
HttpSession session = request.getSession(false);

Session创建后服务器将Session ID 通过Cookie发送到客服端浏览器,而浏览器则将该Session ID 保存在会话Cookie中。当浏览器再次向服务器发送HTTP请求时,会将Session ID 信息一起发送给服务器。服务器根据该Session ID 在服务器内存找到对应的Session对象,即可取出共享数据
session是依赖cookie的,JSessionId通过cookie传递到浏览器,并在浏览器通过cookie的形式存在
在这里插入图片描述

Session的销毁

Session销毁有三种情况:
(1)服务器关闭
(2)调用Session对象的invalidate方法
(3)Session对象超过过期时间
默认情况下Session对象30分钟过期

Session常见问题

  1. 浏览器关闭,服务器不关闭,重新打开浏览器,前后两次获取的Session是否相同?
    (1)默认情况下不相同,因为浏览器关闭后cookie被清空,请求后会重新创建cookie
    (2)如果需要相同,可以为键为JSESSIONID的Cookie设置过期时间,持久化到磁盘,即可在过期时间内获取到相同的Session
  2. 浏览器 不关闭,服务器关闭,重启服务器后,前后两次获取的Session是否相同?
    tomcat服务器关闭后Session对象会被销毁,但tomcat正常关闭后会持久化Session对象到硬盘中,重启时会加载持久化的Session对象,并删除持久化文件。虽然客户端通过相同的JESSIONID前后两次均可获取到Session对象,但Session对象已经不是同一个,不过存储的数据是一致的,只是对象的地址变了

Session和Cookie的区别

(1) Session存储在服务器端,Cookie存储在浏览器端
(2)Session存储无大小限制,Cookie存储数据有大小限制
(3)Session相对Cookie更安全

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值