HTTP会话技术---Cookie、Session和Token介绍及它们在JavaWeb中的使用

当涉及到Web应用程序的身份验证和状态管理时,我们通常会使用到Cookie、Session和Token这些会话技术。下面是对它们的介绍,并在JavaWeb中的示例

Cookie(HTTP Cookie)

Cookie是一种存储在用户浏览器中的小型文本文件,由服务器发送给浏览器,然后浏览器在后续请求中将其包含在HTTP头中发送回服务器。Cookie通常用于跟踪用户的会话状态、存储用户偏好设置等。

Cookie的工作流程

  • 服务端提供了两个Servlet,分别是ServletA和ServletB

  • 浏览器发送HTTP请求1给服务端,服务端ServletA接收请求并进行业务处理

  • 服务端ServletA在处理的过程中可以创建一个Cookie对象并将name=zs的数据存入Cookie

  • 服务端ServletA在响应数据的时候,会把Cookie对象响应给浏览器

  • 浏览器接收到响应数据,会把Cookie对象中的数据存储在浏览器内存中,此时浏览器和服务端就建立了一次会话

  • 同一次会话中浏览器再次发送HTTP请求2给服务端ServletB,浏览器会携带Cookie对象中的所有数据

  • ServletB接收到请求和数据后,就可以获取到存储在Cookie对象中的数据,这样同一个会话中的多次请求之间就实现了数据共享

在Java中使用Cookie,可以使用javax.servlet.http.Cookie类进行操作。以下是使用Cookie的简单示例:

Cookie cookie = new Cookie("username", "john");
cookie.setMaxAge(3600); // 设置Cookie的过期时间为1小时
response.addCookie(cookie); // 将Cookie添加到响应中// 从请求中获取Cookie
Cookie[] cookies = request.getCookies();
if (cookies != null) {for (Cookie cookie : cookies) {if (cookie.getName().equals("username")) {String username = cookie.getValue();// 处理用户名}}
}

在spring中的使用,以登陆为例,在Controller层,Cookie常用于存储和获取用户的身份信息或其他状态信息。当用户进行登录时,Controller可以将用户的身份信息存储在Cookie中,并在后续请求中读取该Cookie来验证用户身份。:

// 登录请求处理
@RequestMapping("/login")
public String login(@RequestParam("username") String username,@RequestParam("password") String password,HttpServletResponse response) {// 验证用户名和密码if (authenticate(username, password)) {// 登录成功,创建Cookie并设置相关信息Cookie cookie = new Cookie("username", username);cookie.setMaxAge(3600); // 设置Cookie的过期时间为1小时response.addCookie(cookie);return "redirect:/home";} else {// 登录失败return "redirect:/login";}
}// 需要验证用户身份的请求处理
@RequestMapping("/profile")
public String profile(HttpServletRequest request) {// 从请求中获取CookieCookie[] cookies = request.getCookies();if (cookies != null) {for (Cookie cookie : cookies) {if (cookie.getName().equals("username")) {String username = cookie.getValue();// 处理用户身份return "profile";}}}// 用户未登录,跳转到登录页return "redirect:/login";
}

Session(会话)

Session是一种在服务器端存储用户状态信息的机制。当用户访问Web应用程序时,服务器会为每个用户创建一个唯一的会话,并为该会话分配一个唯一的标识符(Session ID)。服务器使用该标识符来识别特定的用户会话并存储相关数据。

Session的工作流程

  • 在服务端的AServlet获取一个Session对象,把数据存入其中

  • 在服务端的BServlet获取到相同的Session对象,从中取出数据

  • 就可以实现一次会话中多次请求之间的数据共享了

在Java中,可以使用javax.servlet.http.HttpSession接口来管理会话对象。以下是使用Session的示例:

// 创建或获取会话对象
HttpSession session = request.getSession();// 在会话中存储数据
session.setAttribute("username", "john");// 从会话中获取数据
String username = (String) session.getAttribute("username");

在Controller层,Session通常用于存储和获取用户的会话状态信息。当用户进行登录时,Controller可以在Session中存储用户的身份信息或其他相关数据,在后续的请求中使用该Session来验证用户身份和获取用户信息:

// 登录请求处理
@RequestMapping("/login")
public String login(@RequestParam("username") String username,@RequestParam("password") String password,HttpSession session) {// 验证用户名和密码if (authenticate(username, password)) {// 登录成功,将用户信息存储在Session中session.setAttribute("username", username);return "redirect:/home";} else {// 登录失败return "redirect:/login";}
}// 需要验证用户身份的请求处理
@RequestMapping("/profile")
public String profile(HttpSession session) {// 从Session中获取用户信息String username = (String) session.getAttribute("username");if (username != null) {// 处理用户身份return "profile";}// 用户未登录,跳转到登录页return "redirect:/login";
}

Token(令牌)

Token是一种无状态的身份验证机制,用于验证客户端的身份。服务器在用户进行身份验证后,生成一个包含用户信息的令牌,并将其发送给客户端。客户端在后续请求中将令牌包含在请求头中发送给服务器,服务器通过验证令牌来确认用户的身份。

在Java中,可以使用JSON Web Token(JWT)库来生成和验证令牌。使用JWT:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;// 生成令牌
String secretKey = "yourSecretKey";
String token = Jwts.builder().setSubject("john").setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 设置过期时间为1小时.signWith(SignatureAlgorithm.HS512, secretKey).compact();
request.setHeader("token",token);// 验证令牌
Claims claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody();
String username = claims.getSubject();

在Controller层,Token常用于进行API身份验证。当客户端通过API请求访问受保护的资源时,Controller可以验证传递的Token,从中提取用户身份信息,并根据验证结果进行相应的处理。

// API请求处理
@RequestMapping("/api/profile")
public ResponseEntity<?> getProfile(@RequestHeader("Authorization") String token) {// 验证Tokenif (validateToken(token)) {String username = extractUsernameFromToken(token);// 处理用户身份UserProfile userProfile = getUserProfile(username);return ResponseEntity.ok(userProfile);} else {return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();}
}

大概就是这么个使用法的 ,下面是八股文,它们的区别:

  1. 存储位置:

    • Cookie:Cookie是存储在客户端(浏览器)中的小型文本文件,通过设置响应头将Cookie发送给客户端,客户端将Cookie存储在本地。
    • Session:Session是存储在服务器端的数据结构,通常以键值对的形式存储在服务器内存或持久化存储中。
  2. 数据存储方式:

    • Cookie:Cookie以文本形式存储,可以存储有限大小的数据,一般不超过4KB。
    • Session:Session可以存储更大的数据,因为它是在服务器端进行存储的,通常没有明确的大小限制。
  3. 安全性:

    • Cookie:Cookie存储在客户端,因此可以被篡改或窃取,存在一定的安全风险。为了增加安全性,可以对Cookie进行加密或使用安全标记(Secure Flag)来限制只在HTTPS连接中传输。
    • Session:Session存储在服务器端,客户端无法直接访问和修改Session数据,相对来说更安全一些。但仍需注意保护Session ID,以防止会话劫持攻击。
  4. 生命周期:

    • Cookie:Cookie可以设置过期时间,可以是会话Cookie(在浏览器关闭时删除)或持久Cookie(在指定的过期时间之后删除)。
    • Session:Session的生命周期由服务器管理,通常在用户会话开始时创建,在一定时间内保持活动状态,或者在用户注销或超时后销毁。
  5. 跨域支持:

    • Cookie:Cookie在同一域名下的不同路径之间共享,但在不同域名之间不能共享。
    • Session:Session默认在同一域名下共享,但可以通过其他机制实现跨域共享。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/199949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Springboot的在线问卷调查系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的在线问卷调查系统(有报告)。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring…

1-4节电池升降压充电IC解决方案

描述 MP2760是一款集成窄电压DC&#xff08;NVDC&#xff09;电源路径管理功能和USB On-the-Go(OTG)功能的升降压充电IC&#xff0c;兼容USB PD&#xff0c;适用于单节至4节串联的电池包应用。该芯片的充电输入电压范围广&#xff0c;可支持最高22V。 当启用电池放电模式&…

深入学习Synchronized各种使用方法

文章目录 前言一、synchronized关键字通用在下面四个地方&#xff1a;1.1synchronized修饰实例方法1.2synchronized修饰静态方法&#xff1a;1.3synchronized修饰实例方法的代码块1.4synchronized修饰静态方法的代码块2.读入数据 二.Sychronized关键特性2.1互斥2.2 刷新内存2.3…

CentOS 7 虚拟机java项目部署tomcat

首先安装java环境 下载安装包:jdk-19_linux-x64_bin.tar.gz_免费高速下载|百度网盘-分享无限制 (baidu.com) 将安装包上传到虚拟机 解压 tar zxvf jdk-19_linux-x64_bin.tar.gz 移动文件到 mv jdk-19.0.1 /usr/jdk-19.0.1 编辑配置文件 vim /etc/profile export JAVA…

解决cad找不到msvcr100.dll的有效方法,完美修复dll问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是由于找不到msvcr100.dll文件而导致CAD软件无法正常运行的情况&#xff0c;系统无法找到所需的动态链接库文件。但是通过一些简单的解决方法&#xff0c;我们可以快速解决这个问题并继续我们的…

【动态规划】LeetCode-62.不同路径

&#x1f388;算法那些事专栏说明&#xff1a;这是一个记录刷题日常的专栏&#xff0c;每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目&#xff0c;在这立下Flag&#x1f6a9; &#x1f3e0;个人主页&#xff1a;Jammingpro &#x1f4d5;专栏链接&…

HNU-计算机网络-讨论课2

第二次 有关网络智能、安全以及未来网络的讨论 一、必选问题&#xff08;每组自由选择N个&#xff0c;保证组内每人负责1个&#xff09; 网络的发展促进信息的传播&#xff0c;极大提高了人类的感知能力&#xff0c;整个世界都被纳入人类的感知范围。但人们对信息系统以及数据…

手持式安卓主板_PDA安卓板_智能手持终端方案

手持式安卓主板方案是一种智能终端设备&#xff0c;具备自动对焦和闪光灯功能&#xff0c;可以在昏暗的环境下快速扫描二维码并轻松采集数据。该方案还提供多渠道支付和数据采集功能&#xff0c;为用户提供了便捷的体验。 该方案的产品基于手持式安卓主板&#xff0c;并搭载了八…

C/C++,图算法——求强联通的Tarjan算法之源程序

1 文本格式 #include <bits/stdc.h> using namespace std; const int maxn 1e4 5; const int maxk 5005; int n, k; int id[maxn][5]; char s[maxn][5][5], ans[maxk]; bool vis[maxn]; struct Edge { int v, nxt; } e[maxn * 100]; int head[maxn], tot 1; vo…

Unity UGUI控件之Horizontal Layout Group

Horizontal Layout Group是Unity中的UGUI控件&#xff0c;用于在水平方向上对子对象进行布局。 主要有一下作用&#xff1a; 水平布局&#xff1a;Horizontal Layout Group将子对象按照水平方向进行布局&#xff0c;可以控制子对象的排列顺序和间距。自动调整尺寸&#xff1a…

不到1000行代码,PyTorch团队让Llama 7B提速10倍

在过去的一年里&#xff0c;生成式 AI 发展迅猛&#xff0c;在这当中&#xff0c;文本生成一直是一个特别受欢迎的领域&#xff0c;很多开源项目如 llama.cpp、vLLM 、 MLC-LLM 等&#xff0c;为了取得更好的效果&#xff0c;都在进行不停的优化。 作为机器学习社区中最受欢迎框…

面试就是这么简单,offer拿到手软(四)—— 常见java152道基础面试题

面试就是这么简单&#xff0c;offer拿到手软&#xff08;一&#xff09;—— 常见非技术问题回答思路 面试就是这么简单&#xff0c;offer拿到手软&#xff08;二&#xff09;—— 常见65道非技术面试问题 面试就是这么简单&#xff0c;offer拿到手软&#xff08;三&#xff…

WIN10下解决HIVE 初始化MYSQL表报错:Unknown version specified for initialization

今天本地WINDOWS装HIVE&#xff0c;走到最后一步初始化数据库死活不通过&#xff1a; D:\hive\hive-rel-release-3.1.3\bin\ext>hive --service schematool -dbType mysql -initSchema --verbose SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found bind…

flask 上传文件

from flask import Flask, request, render_template,redirect, url_for from werkzeug.utils import secure_filename import os from flask import send_from_directory # send_from_directory可以从目录加载文件app Flask(__name__)#UPLOAD_FOLDER media # 注意&#xff…

会声会影2024购买多少钱 会声会影在哪里购买

掌握视频编辑技术&#xff0c;能为我们的工作和生活带来很多帮助。例如&#xff1a;将我们精心编辑的视频&#xff0c;上传到抖音、快手等平台进行变现&#xff1b;通过天马行空的视频创意&#xff0c;摇身一变成为B站up主。因此&#xff0c;拥有一款像会声会影这样的视频编辑软…

信号可靠性剖析

问题 基于信号发送的进程间通信方式可靠吗&#xff1f;&#xff1f;&#xff1f; 信号查看(kill -l) 信号的分类 不可靠信号 (传统信号) 信号值在 [1, 31] 之间的所有信号 可靠信号 (实时信号) 信号值在 [SIGRTMIN&#xff0c;SIGRTMAX]&#xff0c;即&#xff1a;[34&…

计算机组成原理学习-总线总结

复习本章时&#xff0c;思考以下问题&#xff1a; 1)引入总线结构有什么好处&#xff1f;2)引入总线结构会导致什么问题&#xff1f;如何解决&#xff1f;

变电站设计综合应用软件

产品概述 变电站设计综合应用软件,以下称为软件,是一款面向智能变电站虚拟二次回路设计和光纤回路设计的单机版桌面应用软件。软件为用户提供了直观易用、一键安装、功能齐全的轻量级的设计支撑。像常规的工具化软件一样,该软件在开始设计时需要通过新建一个项目,开启一段…

【C++】const关键字的详解!!

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Android MVVM+coroutine+retrofit+flow+hilt

文章目录 Android MVVMcoroutineretrofitflowhilt概述依赖注入层数据层视图层模型视图层代码下载 Android MVVMcoroutineretrofitflowhilt 概述 代码结构&#xff1a; 依赖注入层 数据库&#xff1a; Module InstallIn(SingletonComponent::class) class DBModule {Singleto…