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