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

相关推荐
用户311879455921812 分钟前
CentOS 7 安装 bzip2-libs-1.0.6-13.el7.x86_64.rpm 的详细步骤
linux
GISer_Jing15 分钟前
React中Element、Fiber、createElement和Component关系
前端·react.js·前端框架
ZLRRLZ16 分钟前
【Linux操作系统】进程控制
linux·运维·服务器
我想吃余28 分钟前
Linux的Ext文件系统:硬盘理解和inode及软硬链接
linux·运维·电脑
qq762118221 小时前
Linux c 在内存中创建zip,最后写入测试
linux·运维·服务器
半路_出家ren1 小时前
Shell脚本基础应用
linux·网络·shell
折翼的恶魔1 小时前
前端学习之样式设计
前端·css·学习
IT_陈寒2 小时前
JavaScript性能优化:3个被低估的V8引擎技巧让你的代码提速50%
前端·人工智能·后端
云飞云共享云桌面2 小时前
SolidWorks服务器多人使用方案
大数据·运维·服务器·前端·网络·电脑·制造
Red Car2 小时前
javascript 性能优化实例一则
开发语言·javascript·ecmascript