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

news2024/11/27 18:45:55

当涉及到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) {
    // 从请求中获取Cookie
    Cookie[] 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) {
    // 验证Token
    if (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.coloradmin.cn/o/1286836.html

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

相关文章

360公司-2019校招笔试-Windows开发工程师客观题合集解析

360公司-2019校招笔试-Windows开发工程师客观题合集 API无法实现进程间数据的相互传递是PostMessage2.以下代码执行后,it的数据为(异常) std::list<int> temp; std::list<int>::iterator it = temp.begin(); it = --it; 3.API在失败时的返回值跟其他不一样是 …

OSPF浅析

一、预习&#xff1a; 1、优点&#xff1a; 是一种典型的链路状态路由协议&#xff0c;协议号89&#xff0c;把大型网络分隔为多个较小、可管理的单元&#xff1a;Area a.减少LSA泛洪范围&#xff0c;有效地把拓朴变化 控制在区域内&#xff0c;达到网络优化的目的…

混音编曲软件tudio One 6.5.1 保姆级安装教程

根据软件大数据显示De-Esser驯服人声嘶嘶声和其他高频声音&#xff0c;和其他 Studio One 中新的去实体插件一样高效且直观易用&#xff0c;使用“收听”按钮查找有问题的频率&#xff0c;然后使用相关的旋钮和 S-Mon 功能拨入 S-Reduce 量即可。实际上我们可以这样讲工作流和协…

消费数据可视化大屏,助力金融机构智慧运维

在今天的数字化时代&#xff0c;消费数据的可视化已经成为了一种重要的趋势。通过将消费数据以图表、图像等形式展现出来&#xff0c;可以帮助我们更直观地了解消费者的行为和趋势。同时&#xff0c;这也为企业提供了更多的分析和决策依据。无论是针对市场营销策略的制定&#…

如何搭建eureka-server

在Spring Cloud项目的pom文件中添加eureka-server的starter依赖坐标 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://ma…

科技论文中的Assumption、Remark、Property、Lemma、Theorem、Proof含义

一、背景 学控制、数学、自动化专业的学生在阅读论文时&#xff0c;经常会看到Assumption、Remark、Property、Lemma、Theorem、Proof等单词&#xff0c;对于初学者可能不太清楚他们之间的区别&#xff0c;因此这里做一下详细的说明。 以机器人领域的论文为例。 论文题目&…

Footprint Analytics x Future3 万字研报:AI 与 Web3 数据行业融合的现状、竞争格局与未来机遇探析(上)

GPT的横空出世将全球的目光吸引至大语言模型&#xff0c;各行各业都尝试着利用这个“黑科技”提高工作效率&#xff0c;加速行业发展。Future3 Campus携手Footprint Analytics共同深入研究AI与Web3结合的无限可能&#xff0c;联合发布了《AI与Web3数据行业融合现状、竞争格局与…

数电笔记之寄存器

数电 1 数字电路基础 1.2 二进制数据表达 1.2.1 二进制简介 1.2.2 用二进制表达文字 常用的中文字符集&#xff1a;GBK&#xff0c;UTF8 1.2.3 用二进制表达图片 图片像素化&#xff0c;像素数字化 1.2.4 用二进制表达声音 1.2.5 用二进制表达视频 1.3 数字电路 1.3…

tmux简单使用

它允许你在一个终端窗口中创建多个终端会话&#xff0c;并在它们之间进行切换。以下是tmux的一些主要用途和功能&#xff1a; 多窗口&#xff1a; Tmux允许你在一个终端中创建多个窗口。每个窗口可以包含一个或多个终端会话&#xff0c;你可以轻松地在这些窗口之间切换。面板分…

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

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

HITOS_LAB5 进程运行轨迹的跟踪与统计

5. 进程运行轨迹的跟踪与统计 5.1. 实验目的 掌握 Linux 下的多进程编程技术&#xff1b;通过对进程运行轨迹的跟踪来形象化进程的概念&#xff1b;在进程运行轨迹跟踪的基础上进行相应的数据统计&#xff0c;从而能对进程调度算法进行实际的量化评价&#xff0c; 更进一步加…

基于Transformer的U型医学图像分割网络综述

基于Transformer的U型医学图像分割网络综述 论文来自 计算机应用 2023 摘 要&#xff1a;目前&#xff0c;医学图像分割模型广泛采用基于全卷积网络&#xff08;FCN&#xff09;的U型网络&#xff08;U-Net&#xff09;作为骨干网&#xff0c;但卷积神经网络&#xff08;CNN&am…

十三、FreeRTOS之FreeRTOS时间管理

本节主要介绍以下内容&#xff1a; 1&#xff0c;延时函数介绍&#xff08;了解&#xff09; 2&#xff0c;延时函数解析&#xff08;熟悉&#xff09; 3&#xff0c;延时函数演示实验&#xff08;掌握&#xff09; 4&#xff0c;课堂总结&#xff08;掌握&#xff09; 一、…

【Transformer论文精读系列】(一)如何理解Transformer里的注意力机制?

论文&#xff1a;Attention Is All You Need 参考李沐老师的讲解视频&#xff1a; Transformer论文逐段精读【论文精读】_哔哩哔哩_bilibili 其他参考&#xff1a; 超强动画&#xff0c;一步一步深入浅出解释Transformer原理&#xff01;_哔哩哔哩_bilibili Transformer论文逐段…

2023年【A特种设备相关管理(锅炉压力容器压力管道)】考试内容及A特种设备相关管理(锅炉压力容器压力管道)复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;考试内容根据新A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将A特种设备相关管理…

1970-2022年中国省级国家级开发区数据集

1970-2022年Z国省级国家级开发区数据集 1、时间&#xff1a;1970-2022年 2、指标&#xff1a;单位名称、所属区域、所属省份、所属级别、开发区类型、关注热度、成立时间、核准面积、主导产业、地址、联系电话、经纬度 3、范围&#xff1a;2781个开发区 4、来源&#xff1a…

机器学习---朴素贝叶斯分类器的实现(对文本进行侮辱性言论和非侮辱性言论的分类)

1. loadDataSet函数 import numpy as np# 构造loadDataSet函数用于生成实验样本 def loadDataSet(): postingList[[my, dog, has, flea, problems, help, please],[maybe, not, take, him, to, dog, park, stupid],[my, dalmation, is, so, cute, I, love, him],[stop, postin…

2005-2021年地级市绿色发展注意力数据(根据政府报告文本词频统计)

2005-2021年地级市绿色发展注意力数据&#xff08;根据政府报告文本词频统计&#xff09; 1、时间&#xff1a;2005-2021年 2、指标&#xff1a;省、市、年份、一级指标、关键词、关键词词频、总词频 3、范围&#xff1a;270个地级市 4、来源&#xff1a;地级市政府工作报告…

卡通渲染总结《二》

关于技术的方面&#xff0c;一方面就是其轮廓边缘检测&#xff1a; 主要的方法可以被分为基于图片空间和对象空间&#xff0c;对象空间比图片空间会多一些立体坐标位置的信息。 轮廓类型分类 首先我们顶一下轮廓是什么&#xff0c;从一个视角看去如果一条边相邻的两个面其恰…

python自动化测试之破解滑动验证码

在Web自动化测试的过程中&#xff0c;经常会被登录的验证码给卡住&#xff0c;不知道如何去通过验证码的验证。 一般的情况下遇到验证码我们可以都可以找开发去帮忙解决&#xff0c;关闭验证码&#xff0c;或者给一个万能的验证码&#xff01; 那么如果开发不提供帮助的话&…