java开发web前端cookie session及token会话机制详解

Java开发Web前端Cookie、Session及Token会话机制详解

在Web开发中,为了维护用户的登录状态、保护用户信息的安全,常常使用Cookie、Session、Token等会话机制。本文将详细讲解这三种机制的原理、用法和应用场景。

Cookie

什么是Cookie

Cookie是一种用于保存客户端状态的机制。Web服务器在HTTP响应头中添加Set-Cookie字段的值,浏览器接收到响应后将Cookie保存到本地,当浏览器再次请求时,会将Cookie通过HTTP头传递给服务器,服务器就可通过Cookie辨识客户端状态。

Cookie 的工作原理

Cookie 由服务器发送给客户端,后续客户端的每次请求都会带上Cookie信息。

下面是一个使用Cookie记录用户信息的示例:

@GetMapping("/set-cookie")
public ResponseEntity<String> setCookie(HttpServletResponse response) {
    Cookie cookie = new Cookie("username", "johndoe");
    cookie.setMaxAge(3600); //生命周期为1小时
    response.addCookie(cookie);
    return new ResponseEntity<>("Cookie set", HttpStatus.OK);
}

@GetMapping("/hello")
public ResponseEntity<String> hello(@CookieValue(value = "username", defaultValue = "") String username) {
    if (StringUtils.isEmpty(username)) {
        return new ResponseEntity<>("Hello, stranger!", HttpStatus.OK);
    } else {
        return new ResponseEntity<>("Hello, " + username + "!", HttpStatus.OK);
    }
}

发送/set-cookie请求后,服务器会向客户端设置一个名为username的Cookie,当客户端发起/hello请求时,会通过@CookieValue注解将Cookie值自动注入到username参数中。

Cookie 的应用场景

Cookie一般用于记录用户信息、维护用户登录状态、保存用户偏好设置等功能。

比如,在一个电商网站中,可以使用Cookie保存用户的购物车信息。当用户再次登录网站时,系统可以从Cookie中获取该用户的购物车信息,让用户方便地继续购物。

Session

什么是Session

Session也是一种用于保存客户端状态的机制。Session工作原理与Cookie类似,但是Session将客户端状态保存在服务器内存中,所以相对更安全。

Session 的工作原理

当客户端第一次请求时,服务器会生成一个Session ID,将该ID添加到响应头中的Set-Cookie字段中,并将该ID和客户端状态信息关联存储在服务器内存中。后续客户端的请求会携带Session ID,服务器接收到请求时,通过Session ID在内存中查找对应的客户端状态信息。

下面是一个使用Session记录用户信息的示例:

@PostMapping("/login")
public ResponseEntity<String> login(HttpServletRequest request, @RequestBody Map<String, String> params) {
    String username = params.get("username");
    String password = params.get("password");
    if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
        return new ResponseEntity<>("Username and password cannot be empty!", HttpStatus.BAD_REQUEST);
    }
    if (username.equals("admin") && password.equals("admin")) {
        HttpSession session = request.getSession(true);
        session.setMaxInactiveInterval(30 * 60); //生命周期为30分钟
        session.setAttribute("username", username);
        return new ResponseEntity<>("Login success", HttpStatus.OK);
    } else {
        return new ResponseEntity<>("Username or password is incorrect", HttpStatus.UNAUTHORIZED);
    }
}

@GetMapping("/hello")
public ResponseEntity<String> hello(HttpSession session) {
    String username = (String) session.getAttribute("username");
    if (StringUtils.isEmpty(username)) {
        return new ResponseEntity<>("Hello, stranger!", HttpStatus.OK);
    } else {
        return new ResponseEntity<>("Hello, " + username + "!", HttpStatus.OK);
    }
}

/hello请求中,通过HttpSession注入Session对象,通过getAttribute方法获取Session中保存的用户信息。

Session 的应用场景

Session一般用于记录用户信息、维护用户登录状态、保存用户偏好设置等功能,与Cookie不同的是,Session保存在服务器内存中,所以相对更安全。

比如,在一个社交网站中,可以使用Session保存用户的好友列表,这个列表是不应该暴露给客户端的,使用Session可以更好地保护用户的隐私。

Token

什么是Token

Token是一种基于密钥的认证机制,它将用户信息以及签名后的密钥进行组合,形成一个加密字符串,用于验证用户身份。

Token 的工作原理

当用户第一次登录时,服务器会根据用户的信息和服务器的密钥生成一个Token,并将Token返回给客户端。后续客户端的请求会携带Token,服务器接收到请求时,通过密钥解码Token,验证用户身份。

下面是一个使用Token认证用户身份的示例:

@PostMapping("/login")
public ResponseEntity<String> login(@RequestBody Map<String, String> params) {
    String username = params.get("username");
    String password = params.get("password");
    if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
        return new ResponseEntity<>("Username and password cannot be empty!", HttpStatus.BAD_REQUEST);
    }
    if (username.equals("admin") && password.equals("admin")) {
        String token = TokenUtil.getToken(username);
        return new ResponseEntity<>(token, HttpStatus.OK);
    } else {
        return new ResponseEntity<>("Username or password is incorrect", HttpStatus.UNAUTHORIZED);
    }
}

@GetMapping("/hello")
public ResponseEntity<String> hello(@RequestHeader(value = "Authorization", defaultValue = "") String token) {
    String username = TokenUtil.getUserName(token);
    if (StringUtils.isEmpty(username)) {
        return new ResponseEntity<>("Hello, stranger!", HttpStatus.OK);
    } else {
        return new ResponseEntity<>("Hello, " + username + "!", HttpStatus.OK);
    }
}

/login请求中,用户登陆成功后,服务器会返回一个Token给客户端。/hello请求中,客户端会在请求头中添加Authorization字段,该字段的值为Token。通过TokenUtil工具类的getUserName方法可以解析Token中的用户名信息。

Token 的应用场景

Token一般用于API接口的认证、授权等功能。当客户端需要访问API接口时,需要在请求头中添加Token信息,服务器通过Token验证客户端身份,校验成功后才能返回对应的数据。

比如,在一个社交网站中,可以使用Token认证客户端API请求,只有经过认证的客户端才能获取需要认证的用户信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java开发web前端cookie session及token会话机制详解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 使用jmx exporter采集kafka指标示例详解

    以下是关于使用jmx exporter采集kafka指标的完整攻略: 什么是 JMX Exporter? JMX Exporter 是一个自动化采集系统监控指标并将其解析为 Prometheus 指标格式的工具。它允许用户将 JMX 暴露出来的数据转换成 Prometheus 支持的文本格式。 使用 JMX Exporter 采集 Kafka 指标 以下是使…

    Java 2023年5月20日
    00
  • Java多线程及分布式爬虫架构原理解析

    Java多线程及分布式爬虫架构原理解析 概述 Java是一门高性能语言,多线程和分布式架构是其强大的特性之一,因此在实现爬虫时,我们可以利用Java的这些特性来提高整个爬虫系统的效率。 多线程爬虫架构原理 在Java中,可以通过继承Thread类或实现Runnable接口来创建线程。针对爬虫系统,我们可以将爬虫任务拆分成多个线程进行执行,来提高程序的运行效率…

    Java 2023年5月18日
    00
  • Java eclipse doc文档生成流程解析

    针对Java eclipse doc文档生成流程解析,以下是完整攻略: 1. 准备工作 安装Java Development Kit(JDK):在Oracle官网下载并安装最新版的JDK,配置好环境变量,以便能够在终端执行javac等命令。 安装Eclipse:去Eclipse官网下载并安装最新版的Eclipse,满足Java开发的需要。 2. 配置Ecli…

    Java 2023年5月19日
    00
  • IDEA配置Maven的超详细步骤

    请看下面的“IDEA配置Maven的超详细步骤”完整攻略: 步骤1:下载Maven 首先需要在官网上下载Maven,选择自己需要的版本。下载后将其解压到指定的文件夹中。 步骤2:配置Maven环境变量 将Maven解压到的文件夹添加到系统环境变量中,即将解压后的目录进入到 PATH 变量中。 步骤3:配置IDEA 打开IDEA,选择 File > Se…

    Java 2023年6月2日
    00
  • spring security数据库表结构实例代码

    针对你的问题,我将提供一个完整的攻略来讲解“spring security数据库表结构实例代码”,以下是详细步骤: 1. 规划数据库表结构 首先,需要规划出数据库表结构,这是非常关键的一步。在spring security中,需要创建以下几张表: users(用户表) authorities(角色表) groups(组表) group_authorities…

    Java 2023年5月20日
    00
  • 详解Java实现分治算法

    详解Java实现分治算法 分治算法是一种很重要的算法思想,它具有很高的实用性和普遍性。在本文中,我们将详细讲解如何使用Java实现分治算法,帮助大家更加深入地理解分治算法的实现过程。 什么是分治算法 分治算法指的是将一个大问题拆分成若干个相似的小问题,最终通过合并小问题的解来解决大问题的方法。分治算法一般包括三个步骤: 分解原问题为若干个子问题; 解决每个子…

    Java 2023年5月18日
    00
  • Spring七大组件是哪些以及作用

    Spring是一个流行的Java应用程序框架,它提供了一组可重用的组件来构建企业级应用程序。这些组件通常被称为Spring七大组件,这些组件包括: Spring核心容器:它是Spring框架的基础,提供了依赖注入(DI)和控制反转(IoC)功能。它甚至可以使应用程序更容易与不同的数据源集成。 Spring AOP:面向切面编程(AOP)是Spring框架的另…

    Java 2023年5月19日
    00
  • 全面解析Hibernate关联操作、查询操作、高级特性、并发处理机制

    全面解析Hibernate关联操作、查询操作、高级特性、并发处理机制 Hibernate是一个流行的Java对象关系映射框架,它可以将Java对象映射到数据库表中。本文将全面介绍Hibernate的四个主要方面:关联操作、查询操作、高级特性和并发处理机制。 关联操作 Hibernate支持多种关联操作,包括一对一、一对多、多对一和多对多关联。下面是一对多关联…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部