当前位置: 首页 > news >正文

Spring(2)——Cookie和Session

一、Cookie和Session

1.1 理解Cookie

Cookie 是一种在网络浏览中用于存储和跟踪用户相关信息的技术,以下是关于它的详细介绍:

定义与基本概念

Cookie 是由 Web 服务器发送到用户浏览器并存储在用户计算机上的一小段文本数据。它就像是服务器给浏览器的一个 “便签”,用于在用户浏览网站的过程中记录一些信息,以便服务器能够识别用户身份、跟踪用户行为或存储用户偏好等。

工作原理

  1. 创建与发送:当用户访问一个网站时,服务器可以通过在 HTTP 响应头中添加Set-Cookie字段来创建并发送 Cookie 给浏览器。例如,服务器可能会发送一个包含用户登录状态信息或购物车内容的 Cookie。
  2. 存储在客户端:浏览器接收到 Cookie 后,会根据 Cookie 的属性将其存储在本地计算机的特定位置。不同的浏览器有不同的存储方式和位置,但一般来说,Cookie 会与特定的域名相关联。
  3. 后续请求发送:在用户后续访问同一网站时,浏览器会自动在 HTTP 请求头中添加相应的 Cookie 字段,将存储的 Cookie 信息发送回服务器。这样,服务器就可以根据这些 Cookie 来识别用户,提供个性化的服务或执行其他相关操作。

主要用途

  • 用户身份识别:Cookie 可以存储用户的登录信息,如用户名、用户 ID 等。这样,当用户下次访问网站时,服务器可以通过读取 Cookie 来自动识别用户身份,无需用户再次输入用户名和密码,实现自动登录功能。
  • 购物车功能:在电子商务网站中,Cookie 用于存储用户添加到购物车中的商品信息。用户在浏览不同页面或关闭浏览器后再次打开时,购物车中的商品信息仍然能够保留,这是因为购物车数据被存储在 Cookie 中,并在用户与网站交互过程中不断更新。
  • 跟踪用户行为:网站可以通过 Cookie 记录用户的浏览历史、点击行为等信息,用于分析用户的兴趣爱好和行为习惯,以便进行个性化推荐和广告投放。例如,用户经常浏览某类商品页面,网站可以根据这些 Cookie 信息向用户推送相关的商品广告。
  • 存储用户偏好:用户在网站上设置的一些偏好选项,如语言设置、字体大小、页面布局等,也可以通过 Cookie 存储。下次用户访问时,网站会根据 Cookie 中的偏好信息来显示相应的页面设置,为用户提供更个性化的浏览体验。

分类

  • 会话 Cookie:这类 Cookie 仅在用户浏览器与网站的一次会话期间有效,当用户关闭浏览器后,会话 Cookie 就会被自动删除。它主要用于在用户浏览网站的过程中临时存储一些信息,如当前页面的浏览状态、临时购物车中的商品等。
  • 持久化 Cookie:与会话 Cookie 不同,持久化 Cookie 会在用户计算机上存储一段较长的时间,具体时长由服务器在设置 Cookie 时指定。即使用户关闭浏览器并重新打开,甚至在几天后再次访问网站,持久化 Cookie 仍然存在,它可以用于存储一些需要长期保留的信息,如用户的登录凭证、长期的用户偏好设置等。

安全性与隐私问题

  • 安全性:Cookie 可能会成为黑客攻击的目标。如果 Cookie 中存储了敏感信息,如用户的登录密码或银行账户信息,一旦 Cookie 被窃取,黑客就可能利用这些信息进行非法操作。因此,网站在使用 Cookie 时需要采取加密等安全措施来保护用户数据。
  • 隐私:由于 Cookie 可以跟踪用户的行为和存储用户信息,这可能会引发用户隐私问题。一些用户可能不希望自己的浏览行为被网站或第三方跟踪和记录。为了保护用户隐私,浏览器通常提供了 Cookie 管理功能,用户可以选择禁用 Cookie 或删除已存储的 Cookie。

1.2 理解Session

定义与基本概念

Session 是服务器端用于跟踪用户会话状态的一种机制。可以把它想象成服务器为每个用户开辟的一个 “私人空间”,在这个空间里服务器可以存储与该用户相关的各种信息,比如用户登录后的身份信息、正在进行的操作状态、购物车中的商品列表等,以便在用户与网站交互的过程中,在不同页面请求之间保持这些信息的连贯性和一致性,为用户提供更个性化、更流畅的服务体验。

工作原理

  1. 创建阶段:当用户首次访问网站时,服务器会为该用户创建一个唯一的 Session 对象,并为其分配一个独一无二的 Session ID。这个 Session ID 就像是用户在服务器端 “私人空间” 的钥匙,用于标识该用户的 Session。
  2. 数据存储:服务器可以在 Session 对象中存储各种与用户相关的数据。例如,用户登录后,服务器会将用户的登录信息、权限信息等存储在 Session 中。这些数据只与当前用户的 Session 相关联,不会与其他用户的数据混淆。
  3. Session ID 传递:服务器通过 HTTP 响应头中的Set-Cookie字段,将 Session ID 发送给浏览器。浏览器接收到后,会将 Session ID 存储在本地的 Cookie 中,建立起浏览器与服务器端 Session 的关联。
  4. 请求识别:在用户后续对该网站的所有请求中,浏览器都会在 HTTP 请求头的 Cookie 字段中带上这个 Session ID。服务器接收到请求后,通过读取 Session ID,就能够找到对应的 Session 对象,从而获取和更新该用户的相关数据,实现对用户会话状态的跟踪。

主要用途

  1. 用户登录状态管理:用户登录网站后,服务器在 Session 中记录用户的登录状态和相关身份信息。在用户访问网站的其他页面时,服务器通过检查 Session 来判断用户是否已登录,以及获取用户的权限级别等信息,从而决定是否允许用户访问特定的页面或功能。
  2. 多页面交互数据传递:在一些涉及多个页面交互的业务场景中,比如多步骤的注册流程、复杂的表单填写等,Session 可以用于在不同页面之间传递用户输入的数据。确保用户在填写完一个页面的信息后,跳转到下一个页面时,之前输入的数据依然有效,无需重新输入。
  3. 购物车功能实现:在电子商务网站中,Session 用于存储用户购物车中的商品信息。用户在不同页面添加或删除商品时,服务器会更新 Session 中的购物车数据。即使用户关闭浏览器后再次打开,只要 Session 没有过期,购物车中的商品信息仍然能够保留,为用户提供了方便的购物体验。

生命周期

Session 有一定的生命周期,从创建开始,到用户长时间不操作导致 Session 超时,或者用户主动退出登录等情况时结束。服务器会为 Session 设置一个超时时间,一般默认是 20 分钟左右,在这个时间内,如果用户没有与服务器进行任何交互,服务器会自动销毁该 Session,释放相关资源。

安全性

Session 存储着用户的重要信息,因此安全性至关重要。服务器需要对 Session ID 进行严格的保密和安全管理,防止 Session ID 被窃取或篡改。通常采用加密传输、设置合理的 Cookie 属性(如HttpOnlySecure等)来增强 Session 的安全性,防止黑客通过窃取 Session ID 来冒充用户进行非法操作。

1.3 Cookie和Session的关系

  1. Cookie是客⼾端保存⽤⼾信息的⼀种机制。Session是服务器端保存⽤⼾信息的⼀种机制。
  2. Cookie和Session之间主要是通过SessionId关联起来的,SessionId是Cookie和Session之间的桥梁。
    Cookie和Session经常会在⼀起配合使⽤。但是不是必须配合。
    完全可以⽤Cookie来保存⼀些数据在客⼾端,这些数据不⼀定是用户⾝份信息,也不⼀定是SessionIdSession中的sessionId也不需要⾮得通过Cookie/Set-Cookie传递,⽐如通过URL传递

二、Java中对于Cookie和Session的基本操作

2.1 获取Cookie

@RequestMapping("/getCookie1")
    public String getCookie1(HttpServletRequest request){
        if (request.getCookies() == null){
            return "没有";
        }
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            System.out.println(cookie.getName() + ":" + cookie.getValue());
        }
        return "获取cookie成功";
    }

    @RequestMapping("/getCookie2")
    public String getCookie2(@CookieValue("bite") String value){
        return "获取bite=" + value;
    }

2.2 设置Session

@RequestMapping("/setSession")
public String setSeesion(HttpServletRequest request){
    HttpSession session = request.getSession();
    session.setAttribute("lzu","夏官营大专");
    session.setAttribute("userName","zhangsan");
    return "session设置成功";
}
  • getSession(true)(默认值),如果Sesseion对象为空,会创建一个空Session。
  • getSession(false),如果Session对象为空,不会创建Session。
  • Session存储在服务器的内存上,服务重启时,session会丢失。
@RequestMapping("/getSession1")
    public String getSession1(HttpServletRequest request){
        HttpSession session = request.getSession(false);
        String lzu = (String) session.getAttribute("lzu");
        String userName = (String) session.getAttribute("userName");
        System.out.println(lzu);

        return "userName" + userName;
    }

    
@RequestMapping("/getSession2")
    public String getSession2(HttpSession session){
        String lzu = (String)session.getAttribute("lzu");
        return lzu;
    }

    
@RequestMapping("getSession3")
    public String getSession3(@SessionAttribute String lzu){
        return lzu;
    }

相关文章:

  • 【时间序列聚类】Feature-driven Time Series Clustering(特征驱动的时间序列聚类)
  • 008-Trae换用DeepSeek后编程能力大幅提升至中级水平
  • Python 实现非对称加密的 A 端和 B 端软件的详细步骤及代码示例
  • Python 实现机器学习的 房价预测回归项目
  • 【算法学习之路】8.栈和队列
  • Flutter中使用NetworkImage加载网络图片缓存问题学习实践
  • HTML 学习路线图
  • !C++中的位运算
  • 大语言模型-全文
  • linux应用:静态文件、 inode(i 节点)、vnode、流
  • Python 网络爬虫教程:从入门到高级的全面指南
  • 自然语言处理:无监督朴素贝叶斯模型
  • Spring Security 官网文档学习
  • GIS工具箱选择指南:四款软件满足多样化空间分析需求
  • Driver com.p6spy.engine.spy.P6SpyDriver claims to not accept jdbcUrl报错
  • 自动化App测试Appium(真机测试)准备
  • 基于SpringBoot+Vue的校园跑腿原生小程序
  • 用 Vue 3.5 TypeScript 做了一个日期选择器(改进版)
  • git subtree管理的仓库怎么删除子仓库
  • 队列概念和结构
  • 印度杰纳布河上游两座水电站均已重新开闸
  • 南通市委常委、市委秘书长童剑跨市调任常州市委常委、组织部部长
  • 两国战机均未侵入对方领空,巴方公布对印回击细节
  • 潘功胜:央行将创设科技创新债券风险分担工具
  • 文旅部:加强对景区索道、游船等设施设备安全隐患排查整治
  • 科普|肩周炎的自限性,意味着不治也能自己好?