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

相关推荐
MyCollege19993 小时前
win10使用ssh访问vmware虚拟机
linux·运维·centos
BillKu4 小时前
Vue3 + Element-Plus 抽屉关闭按钮居中
前端·javascript·vue.js
DevilSeagull4 小时前
JavaScript WebAPI 指南
java·开发语言·javascript·html·ecmascript·html5
面向星辰4 小时前
html中css的四种定位方式
前端·css·html
Async Cipher5 小时前
CSS 权重(优先级规则)
前端·css
大怪v5 小时前
前端佬:机器学习?我也会啊!😎😎😎手“摸”手教你做个”自动驾驶“~
前端·javascript·机器学习
许怀楠5 小时前
【主页介绍】
linux·c++·贪心算法·visual studio
Liquad Li5 小时前
Angular 面试题及详细答案
前端·angular·angular.js
用户21411832636026 小时前
首发!即梦 4.0 接口开发全攻略:AI 辅助零代码实现,开源 + Docker 部署,小白也能上手
前端
大聪明-PLUS6 小时前
GCC 对 C 语言的扩展
linux·嵌入式·arm·smarc