SpringBoot企業級開發之【用戶模塊-登錄】

開發之前我們先看一下接口文檔的要求:

開發思路:

開發實操:

因為我們之前開發注冊的時候,就有了一些相關的操作,所以在這里我們只需要定義登錄的controller即可:

 //用戶登錄@PostMapping("/login")public Result login(@Pattern(regexp = "^\\S{5,16}$")String username,@Pattern(regexp = "^\\S{5,16}$") String password) {//根據用戶名查詢用戶User loginUser = userService.findUserByUsername(username);//判斷用戶是否存在if(loginUser == null){return Result.error("用戶不存在");}//判斷密碼是否正確//因為之前是加密后存儲的密碼,所以我們也應該加密后再判斷是否相同if(Md5Util.getMD5String(password).equals(loginUser.getPassword())){//登錄成功return Result.success("jwt token 令牌");}return Result.error("密碼錯誤");}

測試:

我們將密碼打錯:

我們將密碼打對:

認證登錄【重點】:

為什么會有登錄認證呢?

因為你登錄用戶之后會有很多的對應的操作接口,那么你不登錄就無法使用到這些接口,所以,我們就會有“登錄認證”,首先我們會借助令牌這個東西去校驗我們的登錄是否合理.....

令牌:

令牌是什么:

令牌的作用:

意思就是通過令牌才能夠去訪問登陸后的所有資源

JWT令牌:

我們這里使用JWT令牌(由“頭”、“有效載荷”、“簽名”)

JWT令牌具體有生成步驟和驗證步驟:

生成令牌:
?
引入坐標:
  <!--JWT令牌坐標--><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>4.4.0</version></dependency><!--單元測試依賴--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>

測試類中測試:
package org.huangyingyuan;import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import java.util.Date; 
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;//測試生成的JWT令牌
public class JwtTest {@Testpublic void test() {Map<String, Object> claims = new HashMap<>();claims.put("id", 1);claims.put("username","張三");//生成jwt的代碼String token = JWT.create().withClaim("user",claims)//添加載荷.withExpiresAt(new Date(System.currentTimeMillis() + 1000*60*60*12))//設置過期時間(為12小時).sign(Algorithm.HMAC256("huangyingyuan"));//指定算法,配置秘鑰System.out.println(token);}
}

測試結果為:

驗證令牌:
?
在測試類中測試:
    //驗證jwt令牌@Testpublic void testParse(){//定義字符串token,模擬用戶傳過來的tokenString token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9" +".eyJ1c2VyIjp7ImlkIjoxLCJ1c2VybmFtZSI6IuW8oOS4iSJ9LCJleHAiOjE3NDMzNTc5NTB9" +".ipTTySrl3HwtkmcqUfMyp_os_M9cJIqa2kG01qNPYxo";JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("huangyingyuan")).build();  //構建驗證器DecodedJWT decodedJWT = jwtVerifier.verify(token);  //驗證tokenMap<String, Claim>claims=decodedJWT.getClaims();  //獲取載荷System.out.println(claims.get("user"));}

測試的結果如下:

幾種測試失敗的可能:

1.篡改了頭部和載荷部分的數據,那么驗證失敗

2.密鑰改了,驗證失敗

3.token設置的時間過期

正片開始:

生成JWT令牌:

1.導入Jwt的Util的工具類

省略

2.在controller類下去生成token,返回數據
//用戶登錄@PostMapping("/login")public Result login(@Pattern(regexp = "^\\S{5,16}$")String username,@Pattern(regexp = "^\\S{5,16}$") String password) {//根據用戶名查詢用戶User loginUser = userService.findUserByUsername(username);//判斷用戶是否存在if(loginUser == null){return Result.error("用戶不存在");}//判斷密碼是否正確//因為之前是加密后存儲的密碼,所以我們也應該加密后再判斷是否相同if(Md5Util.getMD5String(password).equals(loginUser.getPassword())){//生成token(JWT令牌)Map<String, Object>claims=new HashMap<String, Object>();claims.put("id",loginUser.getId());claims.put("username",loginUser.getUsername());JwtUtil.genToken(claims);String token = JwtUtil.genToken(claims);//登錄成功return Result.success(token);}return Result.error("密碼錯誤");}
3.測試

驗證JWT令牌:
?

我們先看一下接口文檔的要求:

需要在請求頭獲取令牌,并定義了請求頭名的是什么

若錯誤,定義響應碼為401

攔截器:

設置攔截器后的登錄驗證流程:

注意!

1.@RequestHeader("Authorization")設置請求頭

2.傳入HttpServletResponse參數,提供響應碼

package org.huangyingyuan.controller;import jakarta.servlet.http.HttpServletResponse;
import org.huangyingyuan.pojo.Result;
import org.huangyingyuan.utils.JwtUtil;
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;//模擬在用戶登陸后才能使用的功能(在學習JWT令牌的作用)
@RestController
@RequestMapping("/article")
public class ArticleController {@GetMapping("/list")public Result<String> list(@RequestHeader("Authorization") String token, HttpServletResponse response) {//如果接受成功則解析token,失敗則修改狀態碼為401try{//模擬token驗證Map<String, Object> claims = JwtUtil.parseToken(token);return Result.success("所有的文章數據....");}catch (Exception e){//http響應狀態碼為401response.setStatus(401);return Result.error("未登錄");}}
}

我們在測試接口的時候,要注意先登錄,然后復制令牌過來后,設置Heager請求頭再加入value的值為令牌,再發送數據請求即可登錄使用成功

多功能:

咱們前面是登陸后的一個功能,那么登陸后有多個功能呢?怎么辦?

答案是 使用攔截器:

使用攔截器后:

我們使用了攔截器的話,就不用controller類下的攔截了,要注釋掉這些攔截功能

編寫攔截器接口:

創建一個interceptors攔截器包,下創建一個LoginInterceptor類,編寫關于登錄的攔截器:

package org.huangyingyuan.interceptors;import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.huangyingyuan.pojo.Result;
import org.huangyingyuan.utils.JwtUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import java.util.Map;//攔截器(登錄攔截器)@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//令牌驗證String token =request.getHeader("Autorization");//驗證tokentry{//模擬token驗證Map<String, Object> claims = JwtUtil.parseToken(token);//放行return true;}catch (Exception e){//http響應狀態碼為401response.setStatus(401);//不放行return false;}}
}
注冊攔截器接口:
?

在config包下,創建一個WebConfig類【注冊攔截器】:

package org.huangyingyuan.config;import org.huangyingyuan.interceptors.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//登錄接口(/user/login)和注冊類接口(/user/register)不攔截registry.addInterceptor(loginInterceptor).excludePathPatterns("/user/login", "/user/register");}
}

結果:

1.沒勾選令牌參數配置:

2.勾選了令牌配置:

這樣子就實現了“驗證令牌headers”的相關操作,實現了多頁面跳轉的攔截器操作!

干貨滿滿,點個關注,下期更精彩

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/75930.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75930.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/75930.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql 8.0.27-docker

安裝 可以略過本步 https://dev.mysql.com/downloads/https://dev.mysql.com/downloads/ 鏡像查詢與安裝 先查詢&#xff1a; docker search mysql 明顯會報錯 Error response from daemon: Get "https://index.docker.io/v1/search?qmysql&n25": dial tcp…

Pgvector的安裝

Pgvector的安裝 向量化數據的存儲&#xff0c;可以為 PostgreSQL 安裝 vector 擴展來存儲向量化數據 注意&#xff1a;在安裝vector擴展之前&#xff0c;請先安裝Postgres數據庫 vector 擴展的步驟 1、下載vs_BuildTools 下載地址&#xff1a; https://visualstudio.microso…

Python高階函數-sorted(深度解析從原理到實戰)

一、sorted()函數概述 sorted()是Python內置的高階函數&#xff0c;用于對可迭代對象進行排序操作。與列表的sort()方法不同&#xff0c;sorted()會返回一個新的已排序列表&#xff0c;而不改變原數據。 基本語法 sorted(iterable, *, keyNone, reverseFalse)二、核心參數詳…

ArcGIS Pro/GeoScene Pro AI 助手 2.1

引言 面對ArcGIS Pro/GeoScene Pro復雜的操作界面和腳本開發需求&#xff0c;你是否還在為功能定位、代碼調試和效率優化而煩惱&#xff1f;今天&#xff0c;推出自制的Pro AI助手2.0版本&#xff0c;七大核心功能將革新你的GIS工作方式&#xff01;無論是界面操作指引、一鍵生…

如何將本地更改的README文件同步到自己的GitHub項目倉庫

如何將本地更改的 README 文件同步到 GitHub 倉庫 在你 git clone 下來的工程目錄下&#xff1a; 先使用 robocopy YOUR\SOURCE\CODE\DIR YOUR\GIT\CLONE\DIR /E /XD .git /DCOPY:T 將你的更改Copy到你git下來的工程中&#xff08;上面的命令會自動處理&#xff0c;例如只會C…

PostIn V1.0.8版本發布,IDEA 插件支持一鍵掃描上報,讓接口定義不再繁瑣

PostIn是一款國產開源免費的接口管理工具&#xff0c;包含項目管理、接口調試、接口文檔設計、接口數據MOCK等模塊&#xff0c;支持常見的HTTP協議、websocket協議等&#xff0c;支持免登陸本地接口調試&#xff0c;同時可以對項目進行靈活的成員權限、消息通知管理等。本周Pos…

UE5學習筆記 FPS游戲制作36 UI動畫

文章目錄 目的效果創建動畫UI準備制作動畫 播放動畫目的效果創建動畫UI準備制作動畫 播放動畫注冊播放事件 目的效果 我們要創建一個提示動畫&#xff0c;文字先漸顯&#xff0c;然后向上移動&#xff0c;同時漸隱 創建動畫 UI準備 創建一個UI控件&#xff0c;然后創建一個…

HTTP 響應頭 Strict-Transport-Security 缺失漏洞

HTTP 響應頭 Strict-Transport-Security 缺失漏洞 這個漏洞就是說明網站的HTTP響應頭中沒有設置Strict-Transport-Security&#xff0c;沒有設置則可以通過將https自己手動改成htttp的方式進行訪問。不安全 解決方法 1.nginx配置 nginx中增加如下配置&#xff1a; location / …

代理模式的優缺點是什么?

什么是代理模式&#xff1f; 代理模式&#xff08;Proxy Pattern&#xff09;是一種結構型設計模式&#xff0c;它通過創建代理對象來控制對原始對象的訪問。 這種模式在前端開發中廣泛應用&#xff0c;特別是在需要控制對象訪問、添加額外邏輯或優化性能的場景中。 ??核心…

【嵌入式學習3】UDP發送端、接收端

目錄 1、發送端 2、接收端 3、UDP廣播 1、發送端 from socket import *udp_socket socket(AF_INET,SOCK_DGRAM) udp_socket.bind(("127.0.0.1",3333))data_str "UDP發送端數據" data_bytes data_str.encode("utf-8") udp_socket.sendto(d…

AI重構SEO關鍵詞精準布局

內容概要 在傳統SEO策略面臨搜索場景碎片化、用戶意圖復雜化的挑戰下&#xff0c;AI技術通過多維數據分析與算法建模&#xff0c;正在重構關鍵詞布局的邏輯框架。基于自然語言處理&#xff08;NLP&#xff09;的語義分析能力&#xff0c;AI可精準識別搜索詞背后的需求層級&…

谷歌發布網絡安全AI新模型Sec-Gemini v1

谷歌近日宣布推出實驗性AI模型Sec-Gemini v1&#xff0c;旨在通過人工智能技術革新網絡安全防御體系。該模型由Sec-Gemini團隊成員Elie Burzstein和Marianna Tishchenko共同研發&#xff0c;旨在幫助網絡安全人員應對日益復雜的網絡威脅。 攻防不對稱的破局之道 Sec-Gemini團隊…

IntelliJ IDEA下開發FPGA——FPGA開發體驗提升__下

前言 由于Quartus寫代碼比較費勁&#xff0c;雖然新版已經有了代碼補全&#xff0c;但體驗上還有所欠缺。于是使用VS Code開發&#xff0c;效果如下所示&#xff0c;代碼樣式和基本的代碼補全已經可以滿足開發&#xff0c;其余工作則交由Quartus完成 但VS Code的自帶的git功能&…

Python語言的需求分析

Python語言的需求分析 引言 在信息技術快速發展的今天&#xff0c;編程語言的選擇對于軟件開發的成功與否起著至關重要的作用。Python作為一種高級編程語言&#xff0c;以其簡潔易讀的語法和強大的功能受到越來越多開發者的青睞。通過對Python語言的需求分析&#xff0c;我們…

抓wifi無線空口包之Ubuntu抓包(二)

一、設置網卡信道和頻段&#xff0c;并抓包 1、使用iwconfig查看自己機器的無線網卡名稱 wangwang-ThinkCentre-M930t-N000:~$ iwconfig lo no wireless extensions. eno1 no wireless extensions. enxc8a3624ab329 no wireless extensions. wlx90de80d1b5b1 IE…

深度學習實戰電力設備缺陷檢測

本文采用YOLOv11作為核心算法框架&#xff0c;結合PyQt5構建用戶界面&#xff0c;使用Python3進行開發。YOLOv11以其高效的實時檢測能力&#xff0c;在多個目標檢測任務中展現出卓越性能。本研究針對電力設備缺陷數據集進行訓練和優化&#xff0c;該數據集包含豐富的電力設備缺…

Day1:前端項目uni-app壁紙實戰

uni-app官網下載HBuilder。 uni-app快速上手 | uni-app官網 點擊HBuilder 安裝 新建項目 工具——插件安裝 安裝uni-app&#xff08;vue3&#xff09; 我們先來準備一下&#xff1a; 先在wallpaper下新建目錄 我已經建過了 同樣&#xff0c;再在common下建images和style目錄&…

mac命令操作

mac命令操作 快速刪除一行&#xff1a; control u 剪切文件&#xff1a;步驟1、先進行Command c 進行選擇復制文件&#xff0c;2、進行commandoptionv進行移動文件&#xff0c;如果commandv是進行復制文件。 commandcontrolD 三個鍵即可屏幕取詞進行翻譯 mac中可以使用快捷方…

C#語言的加密貨幣

C#語言與加密貨幣&#xff1a;一個開發者的探索之旅 引言 隨著區塊鏈技術的迅猛發展&#xff0c;加密貨幣的應用已經滲透到我們生活的方方面面。作為一種新興的數字資產&#xff0c;加密貨幣不僅改變了傳統的投資方式&#xff0c;而且對全球經濟產生了深遠影響。其中&#xf…

Mysql 概念

MySQL 是一種 關系型數據庫管理系統&#xff08;RDBMS&#xff09;&#xff0c;它使用 結構化查詢語言&#xff08;SQL&#xff09; 來管理和操作數據。它最初由瑞典公司 MySQL AB 開發&#xff0c;后來被 Sun Microsystems 收購&#xff0c;現在屬于 Oracle 公司。 一、MySQL…