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日

相关文章

  • Java操作Jenkins操作凭证(Credential)信息方式

    Java 操作 Jenkins 操作凭证(Credential)信息方式 Jenkins的凭证(Credential)是一种安全机制,用于存储登录Jenkins服务器和与其他系统进行交互时所需的敏感信息,例如密码、API tokens等等。 使用Java操作Jenkins凭证可以让我们在Jenkins系统中实现更加安全的信息存储和交互,方便我们对Jenkin…

    Java 2023年5月20日
    00
  • Java mysql数据库并进行内容查询实例代码

    下面是详细讲解Java连接MySQL数据库并进行内容查询的完整攻略: 前置条件 Java编程环境已经安装并配置好; MySQL数据库已经安装并设置好用户名和密码; MySQL JDBC驱动程序已经下载,并在项目中添加了相关jar包。 连接MySQL数据库 首先,我们需要在Java代码中连接MySQL数据库。这可以通过以下代码完成: import java.s…

    Java 2023年5月19日
    00
  • Spring Boot之内嵌tomcat版本升级操作示例

    Spring Boot之内嵌Tomcat版本升级操作示例 Spring Boot是一个快速开发、便于部署的Java Web框架,它内嵌了Tomcat作为默认的Web容器。本文将介绍如何将Spring Boot内嵌的Tomcat版本升级,帮助开发者更好地使用和优化Spring Boot应用程序。 升级步骤 第一步:查看当前Tomcat版本 首先需要查看当前Sp…

    Java 2023年6月2日
    00
  • JAVA实现LRU算法的参考示例

    以下是“JAVA实现LRU算法的参考示例”的完整攻略: 算法简介 LRU(Least Recently Used)算法是一种常用的缓存淘汰算法。它基于一种常见的思路:如果数据最近被访问过,那么将来访问的概率也更高。因此,LRU算法会优先淘汰最近最少使用的数据。LRU算法在缓存应用中有着广泛的应用,如数据库缓存、页面缓存等。 实现思路 在实现LRU算法时,我们…

    Java 2023年5月19日
    00
  • Java如何获取指定目录文件列表

    获取指定目录文件列表是 Java 编程中常见的操作之一,可以通过 Java 的 File 类来实现。下面是获取指定目录文件列表的完整攻略: 第一步:创建 File 对象 首先需要创建一个 File 对象来表示要获取的目录。File 对象可以接受一个目录路径作为参数,例如: File directory = new File("path/to/dir…

    Java 2023年5月20日
    00
  • 十一、JSP及语法概要

    十一、JSP及语法概要 JSP(Java Server Pages)是Java技术的一种,它允许在程序代码和HTML之间嵌入逻辑代码。使用JSP可以让开发者在不同模块之间进行更好的工作分配,提高项目开发进度和可维护性。 JSP基础 在JSP中可编写JavaScript脚本、HTML代码和Java代码。使用的标签有两种,即Java标签和转译标签。Java标签是…

    Java 2023年6月15日
    00
  • Spring在web.xml中的配置详细介绍

    根据题目的要求,我会给出一个“Spring在web.xml中的配置详细介绍”的完整攻略,包含以下内容: 概述 在web项目中,web.xml是一个非常重要的配置文件,它负责和web服务器打交道,告诉服务器如何处理请求并且将结果返回给客户端。在web.xml中加入Spring的配置信息可以让Spring框架和web服务器配合工作,实现更方便的编写web应用的过…

    Java 2023年6月15日
    00
  • Java实现文件检索系统的示例代码

    Java实现文件检索系统的示例代码攻略 概述 本文将介绍如何使用Java实现一个文件检索系统的示例代码。该系统能够快速、效率地搜索指定文件目录中包含指定内容的文件,并将结果展示出来。 开发环境 JDK 1.8 Apache Maven 3.6.0 IntelliJ IDEA 2021.1 实现过程 引入依赖 使用Maven创建一个Java项目,并在pom文件…

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