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
// 登录@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
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) {
//验证tokentry {Map<String,Object> claims = JwtUtil.parseToken(token);return Result.success("所有的文章数据...");} catch (Exception e) {
// http响应状态码为401response.setStatus(401);return Result.error("未登录");}}}
使用postman
获取用户详细信息
User
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;//主键IDprivate 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中添加如下代码
# 驼峰命名和下划线命名的自动转换
mybatis:configuration:map-underscore-to-camel-case: true
UserController:
@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