前言

在 Web 应用程序中(通俗点,可以理解成一个网站),Session 和 Cookie 是两个非常重要的概念,主要用于实现用户身份认证、数据传递等功能。今天就来讲讲这两个东西。

对于当时刚开始接触到这两个概念的我来说,这两个东西是非常模糊的,当然,这样也和我自己 Java 基础不牢固有关,导致在学习 Java Web 的过程中,埋下了许多地雷。现如今,从新梳理下,希望能给屏幕前的你带来收获。

本篇文章目标人群是学了后忘了的,学了后想要巩固的。当然,还没学,那就更好啦,直接看这一篇就够了!

Session 的概念

Session 是 Web 应用程序中的一种会话管理机制,用于存储和维护用户的会话状态。

那问题来了,什么是「会话」?

会话是指在用户与服务器之间的一系列请求和响应之间的交互过程。

当用户访问 Web 应用时,服务器会创建一个唯一的会话 ID,并将其存储在用户的浏览器中的 Cookie 中。在接下来的请求中,浏览器会将会话 ID 作为参数发送给服务器,以便服务器可以识别用户并将其请求与之前的请求相关联。

为什么会有 Session?

由于 HTTP 协议是无状态的,当用户在网站中进行多次请求,服务器并不能判断这些请求是不是来自同一用户,所以出现了一种技术,这种技术称为「会话跟踪技术」。

会话跟踪技术就能解决这个问题。与无状态的通信相比,会话是一种有状态的通信,这种通信至少需要一方来维护当前的状态信息和历史信息。

Session 就是其中一种会话跟踪技术,当然,后面说的 Cookie 也是。

,并将 Session ID 存储在 Cookie 中或者 URL 参数中。

Session 的原理

Session 的原理是基于服务器端的存储和管理,因此相对来说比较安全。在用户访问 Web 应用程序时,服务器会为每个用户创建一个唯一的 Session ID,服务器会将 Session ID 和对应的会话状态存储在内存或者数据库中,同时也返回一份 Session ID 给浏览器,让浏览器存储在 Cookie 中,并在一定时间内保持有效。当用户进行后续的请求时,服务器会根据 Session ID 来识别用户,并获取和维护用户的会话状态。最后,当用户关闭浏览器或者超过一定时间没有活动时,服务器会自动销毁对应的 Session。

Session 的优点是安全性相对较高,存储容量可以存储任意数据类型,并且可以设置失效时间。但是它也存在一些缺点:

  • 存储在服务器端,需要占用服务器资源(比如内存资源)
  • 失效时间短,一般只有数分钟或数小时
  • 难以跨域共享,不同域名的服务器无法共享 Session

代码如何写?

那服务器这边是怎样去存储和管理的呢?代码是怎样写的呢?

在 Java Web 中,可以使用 Servlet API 中封装好的 Session 对象(HttpSession)来进行操作。

在Servlet API中,HttpSession 由 Servlet容器(比如 Tomcat)创建,它可以存储任意的 Java 对象,我们可以通过 setAttribute() 方法将对象绑定到 Session 中,之后通过 getAttribute() 方法获取绑定在 Session 中的对象。

也就是说,可以在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。

  • 获取 Session 对象

我们可以通过 HttpServletRequest 的 getSession() 方法来获取 HttpSession 对象。如果 HttpSession 对象不存在,则会创建一个新的 Session 对象。

Session 常用方法

以下是一些常用的 Session 对象的方法:

  • setAttribute(String name, Object value):将一个名为 name,值为 value 的对象绑定到 Session 中。

  • getAttribute(String name):获取 Session 中绑定的名为 name 的对象。

  • removeAttribute(String name):从 Session 中删除名为 name 的对象。

  • getId():获取 Session 的唯一标识符。

  • getCreationTime():获取 Session 的创建时间。

  • getLastAccessedTime():获取 Session 的最后访问时间。

  • setMaxInactiveInterval(int interval):设置 Session 的最大不活动时间间隔,单位为秒。

  • getMaxInactiveInterval():获取 Session 的最大不活动时间间隔。

示例代码:

SessionServlet

@WebServlet(name = "SessionServlet", urlPatterns = "/session")
public class SessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取 Session 对象
HttpSession session = req.getSession();
// 将用户名存储到 Session 中
session.setAttribute("username", req.getParameter("username"));
// 重定向到另一个页面
resp.sendRedirect("anotherPage.jsp");
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}

这里使用了 @WebServlet 来配置这个 Servlet,处理的请求映射的路径为 /session,主要进行了 Session 对象的相关操作,存储了用户信息,重定向到另一个页面,通过 Session,此时在另一个页面,就能够获取到存储的信息。

anotherPage.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page session="true" %>
<html>
<head>
<title>这里是有Session的</title>
</head>
<body>
<%
String username = (String) session.getAttribute("username");
%>
<h2>从Session中获取的信息:<%=username%></h2>
</body>
</html>

生成唯一 ID 返回给浏览器

@WebServlet(name = "SessionIdServlet", urlPatterns = "/sessionId")
public class SessionIdServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
// 获取 SessionID
String sessionId = session.getId();
// 创建名为JSESSIONID的 Cookie
Cookie cookie = new Cookie("JSESSIONID", sessionId);
// 设置 Cookie 效时间为30分钟
cookie.setMaxAge(30 * 60);
// 将 Cookie 追加到响应中返回给浏览器
resp.addCookie(cookie);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}

通过浏览器向这个路径 /sessionId 发起请求,就会接收到服务器返回的响应,这里的响应就有我们进行处理的名为 JSESSIONID 的 Cookie

Cookie 的概念

Cookie 和 Session 总是会被拿来比较的。Cookie 和 Session 都是用来跟踪浏览器用户身份的会话技术,或者说一种机制。它们都可以实现在多个页面之间共享用户的状态。

Cookie 的原理

Cookie 是一种在客户端(浏览器)保存数据的机制。

浏览器第一次发送请求到服务器,服务器就创建 Cookie(上面的代码中我们写了),该 Cookie 中包含着信息,可以是用户的信息(用户偏好设置、广告偏好),然将该 Cookie 发送到浏览器。

浏览器之后再次访问服务器时就会携带服务器创建的 Cookie,这不需要我们做任何操作,不需要写任何代码,浏览器帮我们实现了在每一次的请求中都携带上 Cookie。服务器端通过 Cookie 中携带的数据区分不同的用户。

Cookie 的优点是可以长时间保存,并且可以在客户端设置,但是它也存在一些缺点:

  • 安全性相对较差,容易被不法分子获取
  • 存储容量有限,一般只能存储 ASCII 码
  • 失效时间可以设置,但是客户端可以随时清除 Cookie

总结

Session 是一种服务器端的存储机制,它将用户状态信息存储在服务器上,每个用户都有一个独立的 Session。

在用户第一次访问服务器的时候,服务器会为其创建一个 Session,并将 Session ID 放到一个名为 JSESSIONID 的 Cookie 中发送给浏览器。

Cookie 是一种客户端(浏览器)存储机制,它将用户状态信息存储在客户端浏览器上。我们知道,用户第一次访问服务器的时候,服务器会将一些数据(比如 JSESSIONID)写入 Cookie 并发送给客户端,客户端在后续的请求中会将 Cookie 发送给服务器。

在存储容量方面,Cookie 的存储容量较小,一般只能存储 ASCII 码,而 Session 可以存储任意数据类型。在安全性方面,Session 相对于 Cookie 更加安全,因为 Session 存储在服务器,客户端无法直接访问。在跨域共享方面,Cookie 可以跨域共享,而 Session 只能在同一域名下共享。

最后的最后

由本人水平所限,难免有错误以及不足之处, 屏幕前的靓仔靓女们 如有发现,恳请指出!

最后,谢谢你看到这里,谢谢你认真对待我的努力,希望这篇博客对你有所帮助!

你轻轻地点了个赞,那将在我的心里世界增添一颗明亮而耀眼的星!

一文快速回顾 Session 和 Cookie的更多相关文章

  1. 快速理解 session/token/cookie 认证方式

    目录 目录 cookie session token cookie Web Application 一般以 HTTP 协议作为传输协议, 但 HTTP 协议是无状态的. 也就是说 server-sid ...

  2. 快速理解Token,Cookie,Session

    在Web应用中,HTTP请求是无状态的.即:用户第一次发起请求,与服务器建立连接并登录成功后,为了避免每次打开一个页面都需要登录一下,就出现了cookie,Session. Cookie Cookie ...

  3. SESSION和cookie的使用和区别

    PHP中SESSION和cookie的使用和区别 cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制. PHP在http协议的头信息里发送cookie, 因此 setcookie( ...

  4. 再续session和cookie (网络整理)

    摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术.本文将详细讨论session的工作机制并且对在Java ...

  5. 浅谈Session与Cookie的关系

    一.概念理解: 首先cookie是服务端识别客户的唯一标识的依据,客户在访问网站时候,服务端为了记住这个客户,会在服务端按照它的规则制作一个cookie数据,会将这个cookie数据保留在服务端一段时 ...

  6. 理解Session与Cookie

    写在前面的话:Session和Cookie是非常有意思的两个概念,对于两者的管理可以处理的很复杂,但是无论如何,理解Session和Cookie的基本概念和发明初衷,对于问题的解决,大有裨益. === ...

  7. 11月7日上午PHP会话控制(session和cookie)、跨页面传值

    1.session  登录上一个页面以后,长时间没有操作,刷新页面以后需要重新登录. 特点:(1)session是存储在服务器:   (2)session每个人(登陆者)存一份: (3)session ...

  8. 数据库留言板例题:session和cookie区别

    session和cookie区别: <?php session_start(); //session_start();必须写在所有的php代码前边 ?> <!DOCTYPE html ...

  9. 转!!深入理解 Session 与 Cookie

    摘要 Session 与 Cookie 不管是对 Java Web 的初学者还是熟练使用者来说都是一个令人头疼的问题.在初入职场时恐怕很多程序员在面试的时候都被问到过这个问题.其实这个问题回答起来既简 ...

  10. node.js web开发:EXPRESS 4.x 以上使用session和cookie 的记录

    关于session 和cookie 我搞了2-3天, 发现这个玩意也挺麻烦的. 很多教程都是把这种会话保存在nosql里面,比如mongo,或者redis等等.但是我还是想直接保存在计算机的内存中,比 ...

随机推荐

  1. CF1557总结

    CF1557总结 Codeforces Round #737 (Div. 2) 先看了 A .意思是要把序列分成两个子序列,使得两序列各自平均值的和最小,输出最小值,要求 \(O(n)\) .想半天然 ...

  2. DDR内存256M16、512M8含义

    256M16,后面的16是代表数据位数,也可以认为是16个bit.一般一个Byte是8个bit.例如256M4的容量为256*16 bit = 4096Mb = 512MB所以 256M16和 512 ...

  3. 个人js基础知识及看js高级程序设计查漏 汇总

    1.事件循环机制 js单线程操作. 1>主线程读取js代码 ,此时为同步环境,形成相应的堆和执行栈. 2>主线程遇到异步任务,指给对应的异步进程处理. 3>异步进程处理完毕后,将相应 ...

  4. 模态框:JavaScript+css

    solution one: JavaScript,单个模态框展示: modal_tools.js window.onload = function () { //js默认加载页面方法 // get m ...

  5. 【Java】zuul

    报错 com.netflix.zuul.exception.ZuulException: Hystrix Readed time out 解决办法,zuul模块的yml配置文件增加 ribbon: C ...

  6. spider_requests库简单ip代理

    """使用requests 设置ip代理"""import requestsdef func(): url = 'http://ip.273 ...

  7. 数据驱动DDT(Data-Driven Tests):测试数据的参数化

    准备第三方库: 首先安装ddt库,其次在脚本中引入ddt 打开官网 https://pypi.org/project/ddt/ from ddt import ddt,data,unpack @ddt ...

  8. node中get和post接口

    接口传参 使用ajax请求向服务器接口传参,按http协议的约定,每个请求都有三个部分: 请求行: 保存了请求方式,地址,可以以查询字符串的格式附加一部分数据. 请求头:它可以附加很多信息,其中con ...

  9. 2020年第11届蓝桥杯C/C++B组 第二轮省赛

    # JJU-干干 试题A :门牌制作[问题描述]小蓝要为一条街的住户制作门牌号.这条街一共有 2020 位住户,门牌号从 1 到 2020 编号.小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符 ...

  10. DevOps Gitlab环境部署

    DevOps 介绍 目录 DevOps 介绍 一.DevOps 介绍 1.1.1 DevOps 介绍 1.1.2 CI/CD简介 1.1.2 Gitlab安装与使用 一.DevOps 介绍 1.1.1 ...