SpringBoot6-10(黑马)

JWT令牌

简介:

1.JWT全称:JSON Web Token(https://iwt.io/)

定义了一种简洁的、自包含的格式,用于通信双方以json数据格式安全的传输信息。

2.组成:

>第一部分:Header(头),记录令牌类型、签名算法等。例如:("alg":"HS256","type":"JWT")

>第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。例如:{"id":"1","username":"Tom")

>第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来。

注:Base64:是一种基于64个可打印字符(A-Z a-z 0-9 +/)来表示二进制数据的编码方式。

认证登录

需要使用JwtUtil这个工具类

UserController

java 复制代码
//    登录
    @PostMapping("/login")
    public Result<String> login(@Pattern(regexp = "^\\S{5,16}$") String username, @Pattern(regexp = "^\\S{5,16}$")String password) {
        // 根据用户名查询用户
        User loginUser = userService.findByUserName(username);
        //判断该用户是否存在
        if (loginUser == null) {
            return Result.error("用户名错误");
        }

        //判断密码是否正确     loginUser对象中的password是密文
        if (Md5Util.getMD5String(password).equals(loginUser.getPassword())) {
            //登陆成功
            Map<String,Object> claims = new HashMap<>();
            claims.put("id",loginUser.getId());
            claims.put("username",loginUser.getUsername());
            String token = JwtUtil.genToken(claims);
            return Result.success(token);
        }
        return Result.error("密码错误");
    }

ArticleController

java 复制代码
package com.rzl.controller;
import com.rzl.pojo.Result;
import com.rzl.utils.JwtUtil;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RestController
@RequestMapping("/article")
public class ArticleController {
    @GetMapping("list")
    public Result<String> list(@RequestHeader(name = "Authorization") String token, HttpServletResponse response) {
//验证token
        try {
            Map<String,Object> claims = JwtUtil.parseToken(token);
            return Result.success("所有的文章数据...");
        } catch (Exception e) {
//            http响应状态码为401
            response.setStatus(401);
           return Result.error("未登录");
        }


     }




}

使用postman

获取用户详细信息

User

java 复制代码
package com.rzl.pojo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id;//主键ID
    private String username;//用户名
    @JsonIgnore   //让springmvc把当前对象转换为json字符串时,忽略password,最终的json字符串中就没有password这个属性
    private String password;//密码
    private String nickname;//昵称
    private String email;//邮箱
    private String userPic;//用户头像地址
    private LocalDateTime createTime;//创建时间
    private LocalDateTime updateTime;//更新时间
}
复制代码
application.yml中添加如下代码
java 复制代码
#  驼峰命名和下划线命名的自动转换
mybatis:
  configuration:
    map-underscore-to-camel-case: true

UserController:

java 复制代码
    @GetMapping("/userInfo")
    public Result<User> getUserInfo(@RequestHeader(name = "Authorization") String token) {
//        根据用户名查询用户
        Map<String, Object> map = JwtUtil.parseToken(token);
       String username = (String) map.get("username");

       User user = userService.findByUserName(username);
       return Result.success(user);


    }
}

使用postman

相关推荐
百锦再3 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
莲华君3 小时前
React快速上手:从零到项目实战
前端·reactjs教程
百锦再3 小时前
React编程高级主题:测试代码
android·前端·javascript·react.js·前端框架·reactjs
半桔3 小时前
【IO多路转接】高并发服务器实战:Reactor 框架与 Epoll 机制的封装与设计逻辑
linux·运维·服务器·c++·io
易安说AI3 小时前
Ralph Loop 让Claude无止尽干活的牛马...
前端·后端
HABuo4 小时前
【linux文件系统】磁盘结构&文件系统详谈
linux·运维·服务器·c语言·c++·ubuntu·centos
Howrun7774 小时前
关于Linux服务器的协作问题
linux·运维·服务器
颜酱4 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
小白同学_C5 小时前
Lab3-page tables && MIT6.1810操作系统工程【持续更新】
linux·c/c++·操作系统os
失忆爆表症5 小时前
05_UI 组件库集成指南:Shadcn/ui + Tailwind CSS v4
前端·css·ui