前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Cookie和Session区别及原理

Cookie和Session区别及原理

作者头像
Java微观世界
发布于 2025-01-21 00:20:45
发布于 2025-01-21 00:20:45
16600
代码可运行
举报
文章被收录于专栏:springbootspringboot
运行总次数:0
代码可运行

1、Cookie

1.1、Cookie 简介

  • 会话是由一组请求与响应组成,是围绕着一件相关事情所进行的请求与响应。 所以这些请求与响应之间一定是需要有数据传递的,即是需要进行会话状态跟踪的。
  • Cookie 是由服务器生成,保存在客户端的一种信息载体。这个载体中存放着用户访问该站点的会话状态信息。
  • 用户在提交第一次请求后,由服务器生成 Cookie,并将其封装到响应头中,以响应的形式发送给客户端。客户端接收到这个响应后,将 Cookie 保存到客户端。当客户端再次发送同类请求后,在请求中会携带保存在客户端的 Cookie 数据,发送到服务端,由服务器对会话进行跟踪。
  • Cookie 是由若干键值对构成,这里的键一般称为 name,值称为 value。Cookie 中的键值对均为字符串。

1.2、绑定路径

JavaEE 中的 Cookie

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
public class MyCookie {
    @RequestMapping("/cookie/test/getCookie")
    public String getCookie(HttpServletResponse response){
        //创建Cookie对象
        Cookie cookie1 = new Cookie("username", "tom");
        Cookie cookie2 = new Cookie("password", "123456");
        //将Cookie添加到响应中
        response.addCookie(cookie1);
        response.addCookie(cookie2);
        return "success";
    }
}
  • 首次访问,只有响应中存在Cookie,请求中没有
  • 访问路径(http://localhost:8080/cookie/test/getCookie)由资源路径(http://localhost:8080/cookie/test/)与资源名称(getCookie)构成
  • 默认绑定的资源路径
  • 这里绑定的路径的就是域名+路径
  • 相同资源路径不同资源名称访问
  • 即使404空指针也会携带Cookie,因为资源路径(http://localhost:8080/cookie/test/)一致
  • 资源路径(http://localhost:8080/cookie/testOne/)不一致,所有请求中没有携带Cookie

设置绑定路径

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
public class MyCookie {
    @RequestMapping("/cookie/rest/getCookie")
    public String getCookie(HttpServletRequest request,HttpServletResponse response){
        //创建Cookie对象
        Cookie cookie1 = new Cookie("user", "jack");
        Cookie cookie2 = new Cookie("pwd", "666999");
        //设置Cookie对象绑定的路径
        cookie1.setPath(request.getContextPath() + "/rest");
        cookie2.setPath(request.getContextPath() + "/cookie");
        //将Cookie添加到响应中
        response.addCookie(cookie1);
        response.addCookie(cookie2);
        return "success";
    }
}
  • 首次访问,响应中可以看的Cookie及绑定路径
  • cookie1绑定路径/test,这里没有绑定上
  • cookie2绑定路径为/cookie,访问路径为http://localhost:8080/cookie/rest/get,所以绑定路径+/*的请求都可以在请求中拿到Cookie

所以,当path=/则表示此ip端口下的请求都会携带此Cookie

1.3、Cookie保存位置

  • 默认情况下,Cookie 是保存在浏览器的缓存中的,浏览器关闭,缓存消失,Cookie 消失。
  • Cookie 类中有一个方法可以设置 Cookie 的有效时长
  • setMaxAge(int expiry),形参 expiry 的单位为秒,整型
  • 若其值大于 0,则表示要将 Cookie 写入到硬盘文件中;小于 0,则表示 Cookie 存放在浏览器缓存中,与不设置时长等效;等于 0,则表示 Cookie产生后直接失效。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
public class MyCookie {
    @RequestMapping("/cookie/rest/getCookie")
    public String getCookie(HttpServletRequest request,HttpServletResponse response){
        //创建Cookie对象
        Cookie cookie1 = new Cookie("user", "jack");
        Cookie cookie2 = new Cookie("pwd", "666999");
        //设置Cookie对象绑定的路径
        cookie1.setPath(request.getContextPath() + "/");
        cookie2.setPath(request.getContextPath() + "/");
        //设置Cookie的有效期
        cookie1.setMaxAge(60 * 60); //有效时长为1小时
        cookie2.setMaxAge(60 * 60 * 24 * 10); //有效时长为10天
        //将Cookie添加到响应中
        response.addCookie(cookie1);
        response.addCookie(cookie2);
        return "success";
    }
}
  • 请求头中已添加有效期
  • pwd的Cookie的过期时间10天后

1.4、服务端读取请求中的 Cookie

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
public class GetCookie {
    @RequestMapping("/cookie/getCookie")
    public String getCookie(HttpServletRequest request,HttpServletResponse response){
        //从请求中获取Cookie
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            System.out.println(cookie.getName());
            System.out.println(cookie.getValue());
        }
        return "success";
    }
}

2、Session

2.1、Session简介

  • Session,即会话,是 Web 开发中的一种会话状态跟踪技术。
  • Session 则是将会话状态保存在了服务器端。

2.2、Session基本操作

Session 对象的创建

1)通过 HttpServletRequest 的 getSession() 方法获取。该方法具有两个重载的方法。

  • public HttpSession getSession(boolean create):该方法用于创建 Session。若参数 create 为 true,则表示若当前没有Session,则新建一个 Session,若当前存在 Session 则使用当前的 Session。若参数 create 为 false 表示若当前没有 Session,则直接返回 null
  • public HttpSession getSession():相当于 getSession(true),即没有 Session 则创建新的Session。

2)何时使用 getSession(true),即 getSession(),何时使用 getSession(false)呢?

  • 若要向 Session 中存放数据, 则使用 getSession(true),即 getSession()。意义为:若当前存在 Session,则使用当前的 Session;若当前不存在 Session,则创建一个新的Session。因为存放数据是必须要有 Session 的。
  • 若要从 Session 中获取数据,则一般使用 getSession(false)。意义为:若当前存在 Session,则从中获取数据;若当前根本就没有 Session,那就更不可能存在 Session 中的数据了。因为你要查找的数据只可能出现在已经存在的 Session 中,而不可能存在于新建的 Session 中。

Session 域属性空间的操作

  • public void setAttribute(String name, Object value):用于向 Session 的域属性空间中放入指定名称、指定值的域属性。
  • public Object getAttribute(String name):用于从 Session 的域属性空间中读取指定名称为域属性值。
  • public void removeAttribute(String name):用于从 Session 的域属性空间中删除指定名称的域属性。

JavaEE 中的 Session

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
public class MySession {
    @RequestMapping("/session/setSession")
    public String setSession(HttpServletRequest request,HttpServletResponse response){
        //获取Session对象
        HttpSession session = request.getSession();
        //向Session域属性空间中存放属性
        session.setAttribute("pets", "dog");
        return "session存储属性pets=dog;默认过期时间:"+session.getMaxInactiveInterval()+"秒";
    }
    @RequestMapping("/session/getSession")
    public String getSession(HttpServletRequest request,HttpServletResponse response){
        //获取Session对象
        HttpSession session = request.getSession(false);
        if(session != null){
            return "session对象获取属性pets为:"+session.getAttribute("pets");
        }else {
            return "session对象为空";
        }
    }
}
  • session添加属性
  • session.getMaxInactiveInterval():获取session过期时间,通过set设置过期时间
  • 默认时间单位为秒,1800秒也就是30分钟
  • 也可以通过配置文件server.servlet.session.timeout=60m设置过期时间为1小时
  • session获取属性信息

2.3、Session 的工作原理

在服务器中系统会为每个会话(浏览器开关)维护一个 Session。不同的会话,对应不同的 Session。

写入 Session 列表

  • 服务器对当前应用中的Session是以Map的形式进行管理的,这个Map称为Session列表。
  • 该Map的key为一个32位长度的随机串,这个随机串称为JSESSIONID,value则为Session 对象的引用
  • 当用户第一次提交请求时,服务端Servlet中执行到request.getSession()方法后,会自动生成一个Map.Entry对象,key为一个根据某种算法新生成的JSESSIONID,value则为新创建的HttpSession对象。

服务器生成并发送Cookie

  • 在将 Session 信息写入 Session 列表后,系统还会自动将“JSESSIONID”作为 name,这 个 32 位长度的随机串作为 value
  • 以Cookie 的形式存放到响应报头中,并随着响应,将该Cookie 发送到客户端。

注意: Cookie过期时间依然为默认浏览器关闭,Session过期时间这里为默认30分钟

客户端接收并发送 Cookie

  • 客户端接收到这个 Cookie 后会将其存放到浏览器的缓存中。即,只要客户端浏览器不关闭,浏览器缓存中的 Cookie 就不会消失。
  • 当用户提交第二次请求时,会将缓存中的这个 Cookie,伴随着请求的头部信息,一块发送到服务端。

从 Session 列表中查找

  • 服务端从请求中读取到客户端发送来的 Cookie,并根据 Cookie 的 JSSESSIONID 的值,从Map 中查找相应 key 所对应的 value,即 Session 对象。 然后,对该 Session 对象的域属性进行读写操作。
  • 也就是说关闭浏览器,再发送请求,则找不到对应的Session对象了,因为Cookie的JSSESSIONID已过期了
  • 不同的浏览器,Cookie的JSSESSIONID 不一样,则Session不一样,即属性值也可能不一样

2.4、Session 的失效

  • Session 的失效就是指 Session 的超时。若某个Session 在指定的时间范围内一直未被访问,那么 Session 将超时,即将失效。
  • 默认 Session 的超时时间为 30 分钟。需要再次强调的是,这个时间并不是从 Session 被创建开始计时的生命周期时长,而是从最后一次被访问开始计时,在指定的时长内一直未被访问的时长。
  • 也可通过代码提前使 Session 失效。HttpSession 中的方法 Invalide(),使得 Session 失效。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RequestMapping("/session/invalidate")
public String invalidate(HttpServletRequest request,HttpServletResponse response){
    //获取Session对象
    HttpSession session = request.getSession();
    //向Session域属性空间中存放属性
    session.setAttribute("pets", "cat");
    //使用session失效
    session.invalidate();

    System.out.println(session);
    System.out.println(session.getAttribute("pets"));
    
    return "success";
}

输出结果:

注意: Session失效只是不能set和get属性,而非Session对象为null

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-04-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Cookie和Session
Cookie是服务器通知客户端保存键值对的一种技术;保存在客户端 客户端有了Cookie后,每次请求都发送给服务器; 每个Cookie的大小不能超过4kb
技术交流
2022/11/18
5090
Cookie和Session
JavaWeb| 详解Cookie与Session会话技术
今天Web系列终于换了一个主题了,咱们这次来讲讲Cookie和Session会话技术,其实有一定web基础的人对这两个东西还是比较熟悉的,不过不熟悉也没关系,这篇文章我会写的比较详细,也会比较长,如果你看的比较累了可以收藏一下,下次继续来看。
Python进击者
2019/06/21
1K0
JavaWeb| 详解Cookie与Session会话技术
Java--Session与Cookie
Session与Cookie的作用都是为了保持访问用户与后端服务器的交互状态。它们各有优缺点。 Cookie: Cookie的作用通俗地讲就是当一个用户通过HTTP访问一个服务器时,这个服务器会将一些键值对返回给客户端浏览器,并给这些数据加上一些限制条件,在条件符合时这个用户下次访问这个服务器时,数据又被完整地带回给服务器。 由于HTTP是一种无状态的协议,当用户第一次访问请求结束后,后端服务器就无法知道下一次访问的是不是同一用户。Cookie作用正是解决这个问题的。 Cookie现在有两个版本,Versi
SuperHeroes
2018/05/22
6590
动态资源技术JSP|Java与Html的美好相遇
JSP可以用简单易懂的方式表示为:Html+Java=JSP,JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计和显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。
浅羽技术
2020/12/07
2.3K0
动态资源技术JSP|Java与Html的美好相遇
深入理解Session和Cookie的区别
Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。 目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。
李红
2019/06/05
1K0
深入理解Session和Cookie的区别
Cookie、Session踩坑小技巧
​ Cookie(饼干) 是服务器通知客户端保存键值对的一种技术。客户端有了 Cookie 后,每次请求都发送给服务器。每个 Cookie 的大小不能超过 4kb。
上分如喝水
2021/08/16
4140
Cookie、Session踩坑小技巧
JavaWeb11-jsp.cookie.session(2)
http协议规定 Http协议对Cookie做了一些规定,如下所示: a. 一个Cookie的大小,最大为4KB; b. 一个服务器最多向一个浏览器保存20个Cookie; c. 一个浏览器最多可以保存300个Cookie。 我们知道,浏览器将服务器发送过来的cookie保存在本地磁盘,如果cookie过多,必然会加大浏览器的压力,因此Http协议对Cookie做了以上规定。 但是,目前浏览器之间因为竞争,很多都在一定范围内违反了Http规定,例如,一个浏览器最多保存的Cookie个数超过300个。但是也不
Java帮帮
2018/03/19
1.2K0
JavaWeb11-jsp.cookie.session(2)
Java学习之Cookie与Session篇
Cookie 和Session 不同的地方是 cookie是存在于客户端,而session是存在于服务器上。
全栈程序员站长
2022/07/13
1460
会话技术知识点整理(Cookie和Session)
也需要注意,第一次 访问 Cookie1,接收到返回的 set-Cookie,第二次不是只有访问 cookie2 ,才能在响应头里看到Cookie,第二次访问哪个都会被携带,这里只是,我们在 Cookie2 这个页面设置了接收 Cookie 的数组,会被打印出来而已。
大忽悠爱学习
2021/11/15
6190
Cookie和Session
总结:为control类的方法增加一个HttpServletRequest参数,通过request.getCookies()取得cookie 数组。然后再循环遍历数组即可
摸鱼的G
2023/02/22
4620
Session、Cookie 学习笔记
  在开始今天的博文之前首先为自己庆祝一下自己有了三个粉丝,也有了同僚的评论,说实话因为这个开心了好久!哈哈,好了在开始今天的正题之前,首先大家需要了解以下几点:     a. HTTP 协议是无状态的协议,WEB 服务器本身不能识别出哪些请求是同一个浏览器发出的,浏览器的每一次请求都是孤立的;     b. 作为服务器必须能够采用一种机制来唯一标识一个用户,同时记录该用户的状态;     c. WEB 应用中的会话是指一个客户端浏览器与 WEB 服务器之间连续发生的一系列请求和响应过程;     d. W
bgZyy
2018/05/16
1.4K0
Web-第十天 Cookie&Session学习
当用户访问某些Web应用时,经常会显示出该用户上一次的访问时间。例如,QQ登录成功后,会显示用户上次的登录时间。通过本任务,读者将学会如何使用Cookie技术实现显示用户上次的访问时间的功能。
Java帮帮
2018/07/27
7650
Web-第十天 Cookie&Session学习
JSP基础--会话跟踪技术、cookie、session
我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应。例如你给10086打个电话,你就是客户端,而10086服务人员就是服务器了。从双方接通电话那一刻起,会话就开始了,到某一方挂断电话表示会话结束。在通话过程中,你会向10086发出多个请求,那么这多个请求都在一个会话中。
eadela
2019/09/29
1K0
JSP基础--会话跟踪技术、cookie、session
Servlet基础入门学习2
所以为了解决上面这些问题,采用了下面所学的Session方法进行记录用户Client的身份;
全栈工程师修炼指南
2020/10/23
8610
Servlet基础入门学习2
第74节:Java中的Cookie和Session
启动服务器后,会给每个应用程序创建一个ServletContext,并且这个ServletContext对象只有一个。可以用于获取全局参数,工程下的资源,和存取数据,共享数据。
达达前端
2019/07/03
6000
第74节:Java中的Cookie和Session
Session&Cookie
http协议是基于请求与响应的无状态协议,但是进行使用时,通常会进行多次的请求与响应,将多次的请求与响应当做一个会话(浏览器窗口没有关闭)
张哥编程
2024/12/13
1160
Session&Cookie
Cookie和Session的区别
getSession() 描述 在服务器中获取会话,参数如果为true,则当不存在会话时新建会话,参数如果为false,则当不存在会话返回null
王同学要努力
2022/12/30
3160
Cookie和Session详解
服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession
共饮一杯无
2022/11/28
4190
cookie和session
cookie主要完成同一会话中不同请求响应间数据传输的任务。cookie是一种消息载体,是在服务器端生成的,首次会以响应报文中传输到客户端,客户端浏览器会将cookie中的内容保存到本地磁盘上,之后再向服务器发送请求时会带着cookie,从而完成多次请求响应中的消息传输问题。
你的益达
2020/10/15
5900
cookie和session
B/S 结构系统的 缓存机制(Cookie) 以及基于 cookie 机制实现 oa 十天免登录的功能
Cookie 并不是它的原意“甜饼”的意思, 而是一个保存在客户机中的简单的文本文件, 这个文件与特定的 Web 文档关联在一起, 保存了该客户机访问这个Web 文档时的信息, 当客户机再次访问这个 Web 文档时这些信息可供该文档使用。由于“Cookie”具有可以保存在客户机上的神奇特性, 因此它可以帮助我们实现记录用户个人信息的功能, 而这一切都不必使用复杂的CGI等程序 。
RainbowSea
2023/04/30
5750
相关推荐
Cookie和Session
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验