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) {
    // 从请求中获取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.mfbz.cn/a/220803.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch:什么是情感分析?

情感分析的定义 情感分析应用自然语言处理&#xff08;NLP&#xff09;、计算语言学和机器学习来识别数字文本的情感基调。 这使得组织能够识别对其品牌、产品、服务或想法的积极、中立或消极情绪。 最终&#xff0c;它使企业能够更好地了解客户&#xff0c;从而为企业提供可行…

题目:区间更新(蓝桥OJ 3291)

题目描述&#xff1a; 解题思路&#xff1a; 差分模板题。 题解&#xff1a; #include<bits/stdc.h> using namespace std;const int N 1e5 10; int a[N], diff[N] ;//数组的大小不可能开到大于1e9int res(int n, int m) {for(int i 1; i < n; i)cin >&g…

Linux使用root用户安装完MySQL软件后,配置MySQL这个普通用户登录

在 Linux 系统中&#xff0c;当您使用 root 用户安装 MySQL 后&#xff0c;系统会自动创建一个名为 mysql 的系统用户。这个 mysql 用户主要用于管理 MySQL 服务的运行&#xff0c;通常是没有登录系统的权限的。如果您希望使这个 mysql 用户能够登录到系统&#xff0c;您需要设…

GPC-虚拟主平台(VPP)概述

VPP: Virtual Primary Platform 虚拟主平台 2021年12月&#xff0c;GP发布了VPP 2.0。 随着安全芯片生态系统的发展&#xff0c;集成已成为一个显著的趋势。为了支持这一点&#xff0c;GP已经定义了虚拟主平台&#xff08;VPP&#xff09; 规范集概述并标准化了新的SE形式因素…

解决HTTP错误500.19 - internal server error -内部服务器错误的终极指南

在开发和维护网络应用程序时&#xff0c;难免会遇到各种HTTP错误代码。其中&#xff0c;HTTP错误500.19 - 内部服务器错误可谓是最令人头痛的问题之一。当你的应用程序遇到这个错误时&#xff0c;它似乎就像一道墙壁&#xff0c;挡住了你前进的道路。但别担心&#xff0c;本篇技…

极兔快递查询,极兔快递单号查询,将其中的退回件筛选出来

批量查询极兔快递单号的物流信息&#xff0c;将其中的退回件筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 极兔快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界面左上角的…

Python OS模块常用方法整理

os模块包含了普遍的操作系统和文件目录方法 引入类库 首先需要引入类库 import os 常用方法 OS模块方法 获取操作系统类型 nt->window:Microsoft Windows NT posix->Linux/Mac OS: Portable Operating System Interface of UNIX&#xff08;可移植操作系统接口&…

Unity中动态合批

文章目录 前言一、动态合批的规则1、材质相同是合批的前提&#xff0c;但是如果是材质实例的话&#xff0c;则一样无法合批。2、支持不同网格的合批3、动态合批需要网格支持的顶点条件二、我们导入一个模型并且制作一个Shader&#xff0c;来测试动态合批1、我们选择模型的 Mesh…

二叉树进阶经典笔试题_1

1. 二叉树创建字符串 题目链接&#xff1a;606. 根据二叉树创建字符串 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a;给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构…

C语言分支结构程序之if语句(1)

目录 if语句其一 奇数的判定 if语句其二 对奇数偶数的判断 if语句的结构图 专题 语法结构 结构图的阅读方法 结构图示例 相等运算符 关系运算符 嵌套的if语句 if语句其一 大家的一天都会怎么度过呢&#xff1f;我想应该不会是被设计好的程序那样循规蹈矩&#xff0c;我们…

字符集——带你了解UTF-8的前世今生

文章目录 字符集的来历汉字和字母的编码特点Unicode字符集字符集小结编码和解码开发约定 字符集的来历 计算机是美国人发明的&#xff0c;由于计算机能够处理的数据只能是0和1组成的二进制数据&#xff0c;为了让计算机能够处理字符&#xff0c;于是美国人就把他们会用到的每一…

关于 Kubernetes中Admission Controllers(准入控制器) 认知的一些笔记

写在前面 工作中遇到&#xff0c;简单整理记忆博文为官方文档整理涉及内置准入控制的分类理解理解不足小伙伴帮忙指正 人活着就是为了忍受摧残&#xff0c;一直到死&#xff0c;想明了这一点&#xff0c;一切事情都能泰然处之 —— 王小波《黄金时代》 为什么需要准入控制器 准…

【Qt开发流程】之对象模型2:属性系统

描述 Qt提供了一个复杂的属性系统&#xff0c;类似于一些编译器供应商提供的属性系统。然而&#xff0c;作为一个独立于编译器和平台的库&#xff0c;Qt不依赖于非标准的编译器特性&#xff0c;如__property或[property]。 Qt解决方案适用于Qt支持的所有平台上的任何标准c编译…

高性能网络编程 - 白话TCP 三次握手过程

文章目录 概述TCP协议头的格式TCP Finite State Machine (FSM) 状态机三次握手如何在 Linux 系统中查看 TCP 状态 概述 每一个抽象层建立在低一层提供的服务上&#xff0c;并且为高一层提供服务。 我们需要知道 TCP在网络OSI的七层模型中的第四层——Transport层 -----------…

百度智能云正式上线Python SDK版本并全面开源

文章目录 前言一、SDK的优势二、千帆SDK&#xff1a;快速落地LLM应用三、如何快速上手千帆SDK3.1、SDK快速启动3.2. SDK进阶指引 3.3. 通过Langchain接入千帆SDK4、开源社区 前言 百度智能云千帆大模型平台再次升级&#xff01;在原有API基础上&#xff0c;百度智能云正式上线…

MicroPython标准库

MicroPython标准库 arraybinascii(二进制/ASCII转换)builtins – 内置函数和异常cmath – 复数的数学函数collections – 集合和容器类型errno – 系统错误代码gc – 控制垃圾收集器hashlib – 散列算法heapq – 堆队列算法io – 输入/输出流json – JSON 编码和解码math – 数…

周周爱学习之Redis重点总结

redis重点总结 在正常的业务流程中&#xff0c;用户发送请求&#xff0c;然后到缓存中查询数据。如果缓存中不存在数据的话&#xff0c;就会去数据库查询数据。数据库中有的话&#xff0c;就会更新缓存然后返回数据&#xff0c;数据库中也没有的话就会给用户返回一个空。 1.缓…

【6】PyQt信号和槽

1. 信号和槽简介 信号和槽机制是 QT 的核心机制&#xff0c;应用于对象之间的通信 信号和槽是用来在对象间传递数据的方法当一个特定事件发生的时候&#xff0c;signal会被emit出来&#xff0c;slot调用是用来响应相应的signal的Qt中对象已经包含了许多预定义的 signal&#…

全网最新最全的Appium自动化:使用appium后安卓手机无法调出键盘解决方法

问题&#xff1a;用appium进行真机调试后&#xff0c;使用手机的app进行输入时无法调出键盘。 原因&#xff1a;appium调试时&#xff0c;将手机输入法设置成了Unicode IME 注&#xff1a;按键详细操作参考&#xff1a;转载至 作者&#xff1a;oscarforever 地址&#xff1…

Java链接数据库

本文介绍的是Java链接数据库中的JDBC操作&#xff0c;JDBC虽然现在用的不多&#xff0c;但面试的时候会问道。需要有相应的了解。下面以链接MySQL为例子。 JDBC 什么jdbc Java DataBase Connectivity是一种用于执行SQL语句的Java API&#xff0c;它由一组用Java语言编写的类和…