SpringBoot:token是用来鉴权的,那session的作用是什么?

一、前言

**  Token 和 Session 在Web开发中都是用来处理用户认证(Authentication)和授权(Authorization)的重要机制,但它们的工作方式和应用场景有所不同。**

二、Token介绍

1. Token简介

定义:Token(令牌)是一种轻量级的、自包含的、用于在客户端和服务器之间进行安全通信的令牌。它通常包含了一些认证信息(如用户ID、权限等),并且可能被加密或签名以防止篡改。

用途:主要用于无状态(Stateless)的认证。在基于Token的认证中,用户登录后,服务器会生成一个Token并将其发送给客户端。

**  客户端在后续的请求中会将这个Token放在HTTP请求头(如Authorization头)中发送给服务器,服务器验证Token的有效性以确认用户的身份和权限。这种方式非常适合分布式系统、RESTful API以及需要跨域请求的场景。**

特点

**  1. 无状态**:服务器不需要保存Token的状态信息,因此可以更容易地水平扩展。

**  2. 可验证**:Token可以被加密或签名以防止篡改。

**  3. 可扩展**:可以包含用户信息、权限等,方便进行用户授权。

2. Token 实现(使用JWT)

java 复制代码
@PostMapping("/login")  
public ResponseEntity<?> login(@RequestBody UserCredentials credentials) {  
    // 验证用户名和密码  
    if (userService.validateCredentials(credentials)) {  
        // 登录成功,生成Token  
        String jwt = jwtUtil.generateToken(credentials.getUsername());  
        return ResponseEntity.ok(Map.of("token", jwt));  
    }  
    return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid credentials");  
}  
java 复制代码
public String generateToken(String username) {  

    return Jwts.builder()  
            .setSubject(username)  
            .setIssuedAt(new Date(System.currentTimeMillis()))  
            .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 2)) // 2小时过期  
            .signWith(SignatureAlgorithm.HS512, secretKey) // secretKey是你的密钥  
            .compact();  
}

验证

java 复制代码
@GetMapping("/protected")  
public ResponseEntity<?> protectedResource(@RequestHeader("Authorization") String token) {  
    // 验证Token  
    String username = jwtUtil.extractUsername(token);  
    if (username != null && jwtUtil.validateToken(token)) {  
        // 验证通过,业务逻辑
    }  
    return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid token");  
}  

三、Session介绍

1.Session简介

**  定义**:Session(会话)是一种在服务器端存储用户信息的机制。当用户访问网站时,服务器会为该用户创建一个唯一的Session ID,并将这个ID发送给客户端(通常是通过Cookie)。客户端在后续的请求中会带上这个Session ID,服务器通过这个ID来查找对应的Session信息,从而识别用户身份和状态。

**  用途**:主要用于有状态(Stateful)的认证。在基于Session的认证中,用户的登录信息、会话状态等都被保存在服务器上,客户端只需要保存Session ID即可。这种方式对于需要维护用户会话状态的Web应用非常有用。

**  特点**:

1. 有状态:服务器需要保存每个用户的Session信息,这会增加服务器的存储负担,并可能限制服务器的水平扩展能力。

2. 依赖Cookie:Session ID通常是通过Cookie在客户端和服务器之间传递的,因此依赖于客户端的Cookie支持。

3. 易于实现:对于传统的Web应用来说,基于Session的认证方式更加直观和易于实现。

2. Session 实现

java 复制代码
@PostMapping("/login")  
public String login(HttpSession session, @RequestBody UserCredentials credentials) {  
    // 验证用户名和密码  
    if (userService.validateCredentials(credentials)) {  
        // 登录成功,将用户信息放入Session  
        session.setAttribute("user", credentials.getUsername());  
        // 重定向到首页或受保护资源  
        return "redirect:/home";  
    }  
    // 登录失败,返回错误信息或重定向到登录页面  
    return "redirect:/login?error=true";  
}
java 复制代码
请求接口时
@GetMapping("/getOrderInfo")  
public String getOrderInfo(HttpSession session) {  
    // 检查Session中是否有用户信息  
    String username = (String) session.getAttribute("user");  
    if (username != null) {  
        // Session存在,业务处理 
    }  
    // Session不存在或已过期,重定向到登录页面  
    return "redirect:/login";  
}

四、总结

**  Token和Session都是处理用户认证和授权的重要机制,但它们在应用场景、工作方式以及性能特点上有所不同。Token更适合于需要无状态认证、分布式系统或RESTful API的场景,而Session则更适合于传统的Web应用,特别是需要维护用户会话状态的场景。在实际开发中,可以根据应用的需求和场景来选择合适的认证方式。**

相关推荐
尘浮生1 小时前
Java项目实战II基于Spring Boot的宠物商城网站设计与实现
java·开发语言·spring boot·后端·spring·maven·intellij-idea
doc_wei1 小时前
Java小区物业管理系统
java·开发语言·spring boot·spring·毕业设计·课程设计·毕设
荆州克莱2 小时前
杨敏博士:基于法律大模型的智能法律系统
spring boot·spring·spring cloud·css3·技术
生产队队长2 小时前
SpringBoot2:web开发常用功能实现及原理解析-@ControllerAdvice实现全局异常统一处理
java·spring boot
自身就是太阳3 小时前
Maven的高级特性
java·开发语言·数据库·后端·spring·maven
飞翔的佩奇3 小时前
Java项目: 基于SpringBoot+mybatis+maven课程答疑系统(含源码+数据库+毕业论文)
java·数据库·spring boot·毕业设计·maven·mybatis·课程答疑
Flying_Fish_roe3 小时前
Spring Boot-热部署问题
java·spring boot·后端
计算机编程-吉哥4 小时前
计算机毕业设计 办公用品管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
java·spring boot·毕业设计·毕业论文·计算机毕业设计选题·计算机毕业设计开题报告·办公用品管理系统
Flying_Fish_roe5 小时前
Spring Boot-依赖冲突问题
java·linux·spring boot
Dovir多多5 小时前
渗透测试入门学习——php文件上传与文件包含
前端·后端·学习·安全·web安全·php