会话技术--Cookie和Session

会话:一次会话中包含多次请求和响应。
在一次会话中,浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止 会话技术能够在一次会话的多次请求响应间共享数据
会话技术的实现方式:
  • 客户端会话技术:Cookie
  • 服务器端会话技术:Session

客户端会话技术--Cookie

Cookie使用步骤
  1. 创建Cookie对象,绑定数据:new Cookie(String name, String value)
  2. 发送Cookie对象::response.addCookie(Cookie cookie)
  3. 获取Cookie,拿到数据:Cookie[] request.getCookies()
Cookie实现原理
基于响应头set-cookie和请求头cookie实现
  1. 客户端和服务器第一次请求响应:服务器创建Cookie对象,并在set-cookie响应头将Cookie响应给浏览器
  2. 浏览器接收到服务器带有set-cookie头的响应后,将Cookie存储在浏览器中,当下一次浏览器向服务器发送请求时,会在请求头cookie头中附带这cookie
  3. 这样就实现了多次请求响应之间的数据共享

Cookie的一些细节
  • 一次可以发送多个cookie:在服务器端创建多个Cookie对象,多次调用response的addCookie方法将多个Cookie对象发送,但是如果两个Cookie的值相同,那么后加入的Cookie值会覆盖前面的值
  • cookie在浏览器中保存时间
    • 默认情况下,当浏览器关闭后,Cookie数据被销毁(服务器关闭,Cookie仍然存在,因为Cookie存储在浏览器中)
    • 持久化存储:调用Cookie对象的setMaxAge(int seconds)方法实现
        参数取值情况:
      • 正数:将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间,时间到后,cookie文件自动失效
      • 负数:默认值,即浏览器关闭后Cookie被销毁
      • 零:删除cookie信息
  • cookie存储中文问题:在tomcat 8 之前 cookie中不能直接存储中文数据。但是在tomcat8之后,支持直接存储中文,但是对于一些特殊字符(如空格等),仍不能直接存储,需要借助URL编码才行(具体步骤下一篇文章说到)
  • cookie的共享
    • 在一个tomcat服务器中部署了多个项目,在默认情况下,这些项目之间的Cookie是不能共享
      但是可以通过Cookie对象的setPath(String path)方法来设置Cookie的共享范围
      • 默认情况下,设置的是当前项目的虚拟目录
      • 如果要在多个项目之间共享,则可以将path设置为"/"(“/”为服务器路径)
    • 不同服务器之间Cookie的共享
      • setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
      • 例如:设置path为".baidu.com",那么tieba.baidu.com和news.baidu.com两个不同的服务器之间可以共享数据,因为它们的一级域名是.baidu.com

Cookie的特点和作用
  • 特点
    • cookie存储数据在客户端浏览器
    • 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)
    • Cookie存储的键值对都是String类型
  • 作用
    • cookie一般用于存出少量的不太敏感的数据,这是因为Cookie的存储位置决定的,存储在客户端容易丢失和被篡改。
    • 在不登录的情况下,完成服务器对客户端的身份识别

服务器端会话技术--Session

Session使用步骤
  1. 通过resquest获取Session对象:request.getSession()
  2. 调用Session对象的方法存储数据(和request请求转发方法一样)
    • Object getAttribute(String name):通过键获取值
    • void setAttribute(String name, Object value):将数据存储进Session对象
    • void removeAttribute(String name):通过键移除相应的键值对
Session实现原理
    Session的实现是依赖于Cookie的。
  1. 客户端第一次向服务器发送请求,服务器在服务器内部开辟一块内存空间,存放Session对象,并给该内存空间指定一个id
  2. 服务器在响应头set-cookie中设置JSESSIONID=id这个键值对发送给客户端
  3. 客户端接收到服务器的相应后,会将保存着Sessionid的Cookie对象保存在浏览器内存
  4. 当客户端下一次向服务器发送请求的时候,会带着Cookie一起(在请求头cookie中有JSESSIONID=id键值对)
  5. 服务器接收到请求后,得到JSESSIONID=id键值对的id后,会在内存中找到对应id的Session对象
  6. 这就是为什么说Session依赖于Cookie的原因以及多次请求响应之间共享数据的原理

Session细节
  • 当客户端关闭后,服务器不关闭,两次获取session不是同一个:前面说到过,Session是依赖于Cookie的,Cookie在默认情况下当客户端浏览器关闭后是自动销毁的,因此Cookie中的键值对自然也就销毁了,所以两次获取的Session不是同一个,如果需要两次的Cookie是同一个
    • 创建一个Cookie对象,设置cookie的键为JSESSIONID,值为session对象的id
    • 设置cookie的存活时间
    • 那么在cookie存活时间内,服务器通过cookie请求头拿到session的id都是一样的,这样通过id找到的Session对象自然也是同一个
  • 客户端不关闭,服务器关闭后,两次获取的session不是同一个,因为服务器关闭后相应内存会被释放,Session自然也会被释放
    但是一般我们需要获取到的Session对象是同一个,确保数据不丢失,tomcat会自动完成Session的钝化和活化
    • Session的钝化:在服务器正常关闭之前,将session对象序列化到硬盘上
    • Session的活化:在服务器启动后,将session文件转化为内存中的session对象。
  • Session被销毁
    • 服务器关闭
    • session对象调用invalidate() 自杀
    • session默认失效时间 30分钟,可以tomcat服务器的web.xml配置文件中session-config设置所有项目的失效时间,也可以在项目的wen.xml配置文件单独配置项目的失效时间

Session的特点
  • 用于一次会话的多次请求间共享数据,存储在服务器端
  • session可以存储任意类型,任意大小的数据
发布了28 篇原创文章 · 获赞 1 · 访问量 2124

猜你喜欢

转载自blog.csdn.net/weixin_42387411/article/details/100585965