Cookie 和 Session 是 Web 应用程序中用于保持用户状态的两种常见机制,它们之间既有联系也有区别。

Cookie 是由服务器在 HTTP 响应中发送给客户端(通常是浏览器)的一小段数据。客户端将这些信息保存在本地,并在后续的请求中自动将其发送回服务器。

而 Session 是在服务器端创建的一种机制,用于跟踪用户的会话状态。服务器会给每个用户分配一个唯一的会话 ID,并将该 ID 通过 Cookie 或其他方式传递给客户端。客户端随后在请求时携带会话 ID,服务器根据这个 ID 从内存或数据库中检索与该用户相关的会话数据。

1.Cookie和Session的关系

严格意义上来说,Cookie 和 Session 是没有任何关系的,但 Session 的实现中借助了 Cookie 机制。

通过以下 Session 执行的机制,我们就能知道 Session 是如何借助 Cookie 完成自己的执行流程的:

  1. 会话创建:通常情况下,当用户登录成功后,服务器会为该用户创建一个新的会话。在创建会话过程中,服务器会为该会话生成一个唯一的标识符,通常称为 Session ID。
  2. Session ID 传递:服务器将生成的 Session ID 通过响应的方式发送给客户端,使用 SetCookie 命令,将用户的 Session ID 保存在 Cookie 中,通常是一个名为 JSESSIONID 的 Cookie。
  3. Session 数据存储:在服务器端,Session 数据会被存储在一个能够关联 Session ID 的数据结构中(例如内存、数据库或者文件存储等)。常用的方式是将 Session ID 作为键,与对应的 Session 用户身份数据进行关联。
  4. Session ID 验证与检索:当用户发送一个新的请求时,客户端会将之前存储的 Session ID 携带在请求的 Cookie 或请求头中发送给服务器。服务器会根据 Session ID 找到对应的 Session 数据,从而获得用户的状态信息。
  5. Session 数据使用:服务器在获取到 Session 数据后,可以根据具体需求读取、修改或删除其中保存的状态信息。服务器可以通过 Session 来管理用户的登录状态、购物车内容、用户配置等。
  6. Session 过期与销毁:Session 有一个有效期限,一般通过设置一个固定的时间,或者在一定时间内没有用户活动时会将 Session 标记为过期。当 Session 过期时,服务器会销毁对应的 Session 数据,释放内存或其他资源。

所以默认情况下,Session 是借助 Cookie 来完成身份标识的传递的,这样服务器端才能根据 Session ID 和保存的会话信息进行关联,用于找到某个具体登录的用户,所以说:默认情况下,Session 机制是依赖 Cookie 实现的。

2.禁用Cookie后Session还能用吗?

那么问题来了,禁用 Cookie 后 Session 还能用吗?

答案是:默认情况下禁用 Cookie 后,Session 是无法正常使用的。

这是因为大多数 Web 服务器都是依赖于 Cookie 来传递 Session 的会话 ID 的。客户端浏览器禁用 Cookie 时,服务器将无法把会话 ID 发送给客户端,客户端也无法在后续请求中携带会话 ID 返回给服务器,从而导致服务器无法识别用户会话。

但是,默认情况下禁用 Cookie 后,Session 就不能用了,但可以通过一些手段来解决这个问题。

3.解决方案

以下的两种解决方案可以绕过 Cookie 继续运行 Session:

  1. URL 中携带 SessionID:可以通过 URL 重写的方式将 Session ID 添加到所有的 URL 中。服务器生成 Session ID 后,将其作为 URL 的一部分传递给客户端,客户端在后续的请求中将 Session ID 带在 URL 中。服务器端需要相应地解析 URL 来获取 Session ID,并维护用户的会话状态。
  2. 隐藏表单字段传递 SessionID:将 Session ID 添加到 HTML 表单的隐藏字段中。在每个表单中添加一个隐藏的字段,保存 Session ID,客户端提交表单时会将 Session ID 随表单数据一起发送到服务器,服务器通过解析表单数据中的 Session ID 来获取用户的会话状态。

这些方法虽然可以在禁用 Cookie 的情况下继续使用 Session,但需要在服务器端进行相应的代码修改和配置。但同时这些手段也带来了以下几个新问题:

  1. 增加了编码复杂度:需要改前端和后端代码才能继续使用 Session 机制,增加了编码复杂度。
  2. 增加了安全风险:这些替代方法可能会增加一些安全风险,因为 Session ID 将以明文形式出现在 URL 或表单中,很容易被第三方劫持和获取。

小结

Session 实现是依赖 Cookie 来存储会话 ID 的,所以默认情况下,如果禁用了 Cookie,Session 就不能使用了。

但是我们可以通过特殊的手段,例如在 URL 中传递 SessionID 或表单中使用隐藏字段传递 SessionID 的方式,配合服务器端代码的修改,是 Session 机制继续使用,但这样使用增加了编码的复杂度,和带来了一定的安全风险。

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

面试官:禁用Cookie后Session还能用吗?的更多相关文章

  1. 如果客户端禁用cookie,session还能使用吗?

    记得在以前找工作的时候,可多次被问到如果客户端被禁用cookie,session还能使用吗? 今天终于找到了相关的答案:我们来看一下: session是在服务器段保持会话数据的一种方法,对应的cook ...

  2. php 会话控制(禁用cookie后session为什么会失效?)

    首先说明一点:session不一定必须依赖cookie,只是php默认客户端sessionid基于cookie方式保存. 到此,我想你也应该了解了php默认的session客户端保存方式是基于cook ...

  3. session和cookie区别,多台WEB服务器如何共享session,禁用COOKIE后SESSION是否可用,为什么?

    答:session的运行机制: 用户A访问站点Y,如果站点Y指定了session_start();(以下假设session_start()总是存在)那么会产生一个session_id,这个sessio ...

  4. 禁用cookie后session是如何设置的

    我们都知道当在session 会话有基于cookie和基于url两种传递SESSIONID的方法.为了实现客户端禁止cookie发送的情况也不影响客户登陆网站,可以设置 php.ini中 sessio ...

  5. IE禁用Cookie后的session处理

    IE禁用Cookie后解决方案:URL重写 购物车案例<IE禁用Cookie后> 购物界面ShowBook.servlet public void doGet(HttpServletReq ...

  6. 浏览器禁用cookie后php如何保持session会话-use_trans_sid机制

    原文:浏览器禁用cookie后php如何保持session会话-use_trans_sid机制 为防止浏览器禁用cookie导致服务器会话无法保持,php开发了一个机制,该机制开启后,浏览器发起请求后 ...

  7. cookie禁用了,session还能用吗?

    Cookie与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案.但为什么禁用Cookie就不能得到Session ...

  8. 客户端禁用cookies后session是否还起效果

    设置session和cookies的代码(webform1.aspx) if (txtName.Text == "wlzcool") { Session["uid&quo ...

  9. Cookie禁用了,Session还能用吗?原因详解

    Cookie与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案.但为什么禁用Cookie就不能得到Session ...

  10. Cookie禁用了,Session还能用吗?

    Cookie与Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案.Cookie分为两种,一种可以叫做session ...

随机推荐

  1. 内网离线安装docker并配置使用nexus为docker私服

    背景 本文简单记录下最近在内网服务器离线安装docker及配置nexus作为docker私服,踩的一些坑.docker和k8s这块技术我跟得不是很紧,18年的时候用过一阵docker,后来发现它并不能 ...

  2. stat函数详解

    Linux系统函数之文件系统管理 stat函数 作用:获取文件信息 include <sys/types.h> #include <sys/stat.h> #include & ...

  3. Welcome to the Android Open Source Project!

    Android is an open-source software stack for a wide range of mobile devices and a corresponding open ...

  4. Jmeter-变量的嵌套使用

    场景: 有存在获取到多个登录账号,循环获取单个变量的情况. 常用方法: ${__BeanShell(vars.get("变量字段_${变量字段}"))} 取值示例: 思维扩展: 一 ...

  5. python-手机自动化

    摘取:https://www.byhy.net/tut/auto/appium/01/ 用途和特点 Appium 是一个移动 App (手机应用)自动化工具. 手机APP 自动化有什么用? 自动化完成 ...

  6. File --JAVA

    File --JAVA 构造方法 方法 说明 public File (String pathname) 根据文件路径创建对象 public File (String parent, String c ...

  7. synchronized 解决方案

    4.2 synchronized 解决方案 为了避免临界区的竞态条件发生,有多种手段可以达到目的. 阻塞式的解决方案:synchronized,Lock 非阻塞式的解决方案:原子变量 本次课使用阻塞式 ...

  8. Servlet--HttpServlet实现doGet和doPost请求的原理(转)

    Servlet(Server Applet):全称Java Servlet.是用Java编写的服务器端程序.其主要功能在于交互式地浏览和修改数据,生成动态Web内容. 狭义的Servlet是指 Jav ...

  9. L3-011 直捣黄龙

    #include<bits/stdc++.h> using namespace std; using pii = pair<int, int>; const int N = 3 ...

  10. 2023-11-22:用go语言,给你一个长度为 n 下标从 0 开始的整数数组 nums。 它包含 1 到 n 的所有数字,请你返回上升四元组的数目。 如果一个四元组 (i, j, k, l) 满足

    2023-11-22:用go语言,给你一个长度为 n 下标从 0 开始的整数数组 nums. 它包含 1 到 n 的所有数字,请你返回上升四元组的数目. 如果一个四元组 (i, j, k, l) 满足 ...