springboot+vue2集成JWT token實現權限驗證

前端項目搭建參考:

Vue項目的搭建和啟動_vue項目啟動 csdn-CSDN博客

Vue + ElementUI 登錄頁面_vue用戶登錄頁面-CSDN博客

跨域問題前端解決-CSDN博客

實現思路:

1. 實現的目的:為了保護網站安全信息,使用jwt進行權限驗證,也就是說只有登錄用戶才可以看到網站的一些特定內容。那么瀏覽器每次發起請求時,就需要帶上攜帶加密登錄用戶信息的token令牌。而token是用戶登錄時后端返回給前端的。

2. 編寫登錄接口,傳入的登錄form表單跟數據庫儲存的數據一致時,接口返回給前端之前,生成一個token,跟著登錄信息一起返回

3. 前端拿到從服務端返回的token,儲存于localStorage中,然后在前端配置發起請求時統一的攔截器,在請求頭中塞入這個token,這樣每個請求就都攜帶了token

4. 后端這個時候就需要校驗了,你這個請求想要查看我網站的安全信息,我得先看看你有沒有相應用戶的權限,是否之前登錄過,這個依據就是是否攜帶了正確的token。后端需要對大多數請求都進行這個校驗,而每個請求的校驗邏輯是一樣的,所以后端需要寫一個攔截器,攔截所有的請求,只有檢驗你是帶著正確的token來的,才可以訪問資源,當然登錄接口需要放開。

5. 最后還需要在前端的接收請求攔截器中,當某個請求沒有權限,即返回code=401時,需要跳轉到登錄頁面引導用戶登錄或者注冊。

1. pom文件添加JWT依賴

<!--jwt-->
<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>${jwt-version}</version>
</dependency>

2. 生成token,在登錄接口返回給前端

/*** 生成token* @param userId 賬號* @param sign 密碼* @return String*/public static String getToken(String userId, String sign) {return JWT.create().withAudience(userId) //將userId荷載.withExpiresAt(DateUtil.offsetHour(new Date(), 2)) //當前時間2小時后過期.sign(Algorithm.HMAC256(sign));  //password作為token的密鑰}
@RestController
public class LoginController {@Autowiredprivate UserService userService;@PostMapping("/login")public Result<JSONObject> login(@RequestBody User user) {Result<JSONObject> result = new Result<JSONObject>();if (StrUtil.isBlank(user.getUserName()) || StrUtil.isBlank(user.getPassword())) {return Result.error("數據輸入不合法");}User dbUser = userService.login(user);//生成tokenString token = TokenUtils.getToken(user.getUserName(), user.getPassword());JSONObject obj = new JSONObject();obj.set("user", dbUser);obj.set("token", token);result.setResult(obj);result.success("登錄成功");return result;}
}

?3. 前端將token存入localStorage,設置請求攔截器,給每個請求帶上token

submitForm() {this.$refs.form.validate((valid) => {if (valid) {let loginUrl = '/login'postAction(loginUrl, this.form).then((res) => {if (res.success) {let token = res.result.token;localStorage.setItem("token", token)this.$message.success("登錄成功!")router.push("/")}})}else {this.$message({message: '請輸入用戶名和密碼',type: 'warning'});}return false;})}
// request攔截器
// 可以在請求發送之前對請求做一些處理
// 比如統一加token,對請求參數統一加密
request.interceptors.request.use(config => {
// 可以在這里添加認證 tokenconfig.headers['Content-Type'] = 'application/json;charset=utf-8';// config.headers['Authorization'] = 'Bearer your-token';config.headers['token'] = localStorage.getItem("token");return config;},error => {return Promise.reject(error);}
);

??4. 后端設置jwt攔截器,并配置

/*** @Author: EstellaQ* @Date: 2025/4/7 9:20* @Description: jwt攔截器**/
public class JwtInterceptor implements HandlerInterceptor {@Resourceprivate UserMapper userMapper;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String token = request.getHeader("token");if (StrUtil.isBlank(token)) {token = request.getParameter("token");}//如果不是映射到方法直接通過if (handler instanceof HandlerMethod) {//通過反射拿到方法上的注解AuthAccess annotation = ((HandlerMethod) handler).getMethodAnnotation(AuthAccess.class);if (annotation != null) {return true;}}//執行認證if (StrUtil.isBlank(token)) {throw new ServiceException(401, "請登錄");}//獲取token中的useridString userId;try {//解碼userId = JWT.decode(token).getAudience().get(0);} catch (JWTDecodeException e) {throw new ServiceException(401, "請登錄");}//根據token中的userid查詢數據庫User user = userMapper.selectByUserName(userId);if (user == null) {throw new ServiceException(401, "請登錄");}//用戶密碼加簽驗證 tokenJWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getPassword())).build();try {jwtVerifier.verify(token); //驗證token} catch (JWTVerificationException e) {throw new ServiceException(401, "請登錄");}return true;}
}
/*** @Author: EstellaQ* @Date: 2025/4/7 9:54* @Description: 配置攔截規則**/
@Configuration
public class InterceptorConfig extends WebMvcConfigurationSupport {@Overrideprotected void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(jwtInterceptor()).addPathPatterns("/**")   //攔截所有的請求路徑.excludePathPatterns("/login"); //將登錄放行super.addInterceptors(registry);}@Beanpublic JwtInterceptor jwtInterceptor() {return new JwtInterceptor();}
}

??5. 前端設置接口接收之后的攔截器,若權限認證失敗,返回401,則返回登錄接口

request.interceptors.response.use(response => {
// 處理響應數據let res = response.data// 兼容服務端返回的字符串數據if (typeof res == 'string') {res = res ? JSON.parse(res) : res}if (res.code === 401) {router.push("/login")}return res},error => {
// 處理響應錯誤return Promise.reject(error);}
);

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

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

相關文章

Cursor編程-從入門到精通__0409

早期的Github Copilot 最近更新了&#xff0c;支持Agent編程&#xff0c;字節跳動Trae使用&#xff08;免費&#xff09;&#xff0c;但成熟程度不如Cursor&#xff0c;Cursor前50次免費 Copilot VS Cursor*** 1&#xff0c;Cursor VSCode 二次開發&#xff0c;IDE級別 2&…

MyBatis 詳解及代碼示例

MyBatis 是一個 半自動 ORM 框架&#xff0c;主要用于 Java 與數據庫之間的持久化操作&#xff0c;它本質是對 JDBC 的封裝 全名&#xff1a;MyBatis&#xff08;前身 iBATIS&#xff09;核心作用&#xff1a;自動將 SQL 執行結果映射為 Java 對象&#xff1b;也可以將 Java 對…

1.6-抓包技術(Burp Suite\Yakit抓包\Web、APP、小程序)

1.6-抓包技術&#xff08;Burp Suite\Yakit抓包\Web、APP、小程序&#xff09; 如果要使用抓包軟件&#xff0c;基本上第一步都是要安裝證書的。原因如下&#xff1a; 客戶端&#xff08;瀏覽器或應用&#xff09;會檢測到證書不受信任&#xff0c;并彈出 證書錯誤&#xff0…

Java 大視界 -- 基于 Java 的大數據隱私保護在金融客戶信息管理中的實踐與挑戰(178)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

第十屆 藍橋杯 嵌入式 省賽

一、分析 這屆的真題&#xff0c;有點像第七屆的液位檢測。 這屆的題目開始&#xff0c;貌似比賽描述的功能&#xff0c;邏輯上變得更好梳理了。一開始就把大致的功能給你說明一遍&#xff0c;不像之前都是一塊一塊的說明。 1. 基本功能 1&#xff09;測量競賽板上電位器 R…

實現usb的MTP功能

前言:最終結果根據用戶自主選擇可實現host和device功能的切換。 效果展示: 當插入usb時設備會彈窗 當用戶選擇設備模式時pc端就會出現mtp設備盤符 實現mtp設備 ubuntu架構根文件系統通過uMTP-Responder實現usb的MTP功能 添加服務 /home/flynn/firfly_rootfs/lib/system…

React-05React中props屬性(傳遞數據),propTypes校驗,類式與函數式組件props的使用

1.類式組件props基本數據讀取與解構運算符傳遞 <script type"text/babel">// 創建組件class PersonalInfo extends React.Component {render() {// 讀取props屬性 并讀取值console.log(props,this.props);return(<ul><li>姓名&#xff1a;{this.p…

PCI認證 密鑰注入 ECC算法工具 NID_secp521r1 國密算法 openssl 全套證書生成,從證書提取公私鑰數組 x,y等

步驟 1.全套證書已經生成。OK 2.找國芯要ECC加密解密簽名驗簽代碼。給的邏輯說明沒有示例代碼很難的上。 3.集成到工具 與SP聯調。 1.用openssl全套證書生成及驗證 注意&#xff1a;這里CA 簽發 KLD 證書用的是SHA256。因為芯片只支持SHA256算法,不支持SHA512。改成統一。…

藍橋杯每日刷題c++

目錄 P9240 [藍橋杯 2023 省 B] 冶煉金屬 - 洛谷 (luogu.com.cn) P8748 [藍橋杯 2021 省 B] 時間顯示 - 洛谷 (luogu.com.cn) P10900 [藍橋杯 2024 省 C] 數字詩意 - 洛谷 (luogu.com.cn) P10424 [藍橋杯 2024 省 B] 好數 - 洛谷 (luogu.com.cn) P8754 [藍橋杯 2021 省 AB2…

oracle 數據庫字段類型為NUMBER(5,2)時,并且數據庫值為0.1,為什么Java執行SQL查出來時為“.1“?

在 Oracle 數據庫中&#xff0c;當字段類型為 NUMBER(5,2) 且存儲的值為 0.1 時&#xff0c;Java 程序查詢結果可能顯示為 ".1"&#xff08;省略前導零&#xff09;&#xff0c;這是由 Oracle JDBC 驅動默認的數字格式化行為 導致的。以下是原因分析和解決方案&#…

3月AI論文精選十篇

1. Feature-Level Insights into Artificial Text Detection with Sparse Autoencoders[1] 核心貢獻&#xff1a;通過稀疏自編碼器揭示AI生成文本的檢測特征&#xff0c;提出基于特征分布的鑒別方法。研究發現&#xff0c;AI文本在稀疏編碼空間中呈現獨特的"高頻低幅"…

STM32在裸機(無RTOS)環境下,需要手動實現隊列機制來替代FreeRTOS的CAN發送接收函數

xQueueSendToBackFromISR(ecuCanRxQueue, hcan->pRxMsg, &xHigherPriorityTaskWoken)&#xff0c;xQueueReceive(mscCanRxQueue,&mscRxMsg,0)和xQueueSendToBack(mscCanTxQueue, &TxMessageTemp, 0 )這3個函數&#xff0c;在裸機下實現&#xff1a; 在裸機&…

使用PX4,gazebo,mavros為旋翼添加下視的相機(仿真采集openrealm數據集-第一步)

目錄 一.方法一&#xff08;沒成功&#xff09; 1.運行PX4 2.運行mavros通訊 3.啟動仿真世界和無人機 &#xff08;1&#xff09;單獨測試相機 &#xff08;2&#xff09;make px4_sitl gazebo啟動四旋翼iris無人機 二.方法二&#xff08;成功&#xff09; 1.通過 rosl…

7、nRF52xx藍牙學習(nrf_gpiote.c庫函數學習)

續前一篇文章。 3、nrfx_gpiote_in_event_enable void nrfx_gpiote_in_event_enable(nrfx_gpiote_pin_t pin, bool int_enable) {NRFX_ASSERT(nrf_gpio_pin_present_check(pin));NRFX_ASSERT(pin_in_use_by_gpiote(pin));if (pin_in_use_by_port(pin)){nrf_gpiote_polarity_t…

Java 實現插入排序:[通俗易懂的排序算法系列之三]

引言 大家好!歡迎繼續關注我的排序算法系列。今天,我們要學習的是另一種非常基礎且重要的排序算法——插入排序 (Insertion Sort)。 插入排序的思路非常貼近我們日常整理撲克牌的方式,理解起來相對自然。雖然它在最壞情況下的效率不高,但在某些特定場景下,它的表現甚至優…

Java的spring boot項目編譯成功啟動報錯

問題現象&#xff1a;spring boot項目&#xff0c;候刪除一些無用代碼后&#xff0c;build成功&#xff0c;啟動時報錯&#xff1a;找不到java.util.Map或者其他對象&#xff08;用Lombok注解Data&#xff09;中的字段屬性找不到等錯誤。解答&#xff1a; 常見是Lombok版本問題…

PyTorch參數管理詳解:從訪問到初始化與共享

本文通過實例代碼講解如何在PyTorch中管理神經網絡參數&#xff0c;包括參數訪問、多種初始化方法、自定義初始化以及參數綁定技術。所有代碼可直接運行&#xff0c;適合深度學習初學者進階學習。 1. 定義網絡與參數訪問 1.1 定義單隱藏層多層感知機 import torch from torch…

基于springboot+vue的課程管理系統

一、系統架構 前端&#xff1a;vue | element-ui 后端&#xff1a;springboot | mybatis-plus 環境&#xff1a;jdk1.8 | mysql8 | maven | node v16.20.2 | idea 二、代碼及數據 三、功能介紹 01. 登錄 02. 管理員-首頁 03. 管理員-系管理 04. 管理員-專業管理 05. 管…

ssh密鑰連接遠程服務器并用scp傳輸文件

ssh密鑰連接遠程服務器 私鑰的權限必須是600chmod 600 id_rsa連接時在命令中加上私鑰的地址ssh -i PATH_to_id_rsa usernameip -p port scp -P port -i PATH_to_id_rsa file usernameip:PATH

ElasticSearch遷移數據

一、查詢索引 1、查詢所有索引 curl --user elastic:123456 -XGET "http://localhost:19200/_cat/indices?v&sindex" 2、查詢索引配置 以索引名稱hello為例 curl --user elastic:123456 -XGET "http://localhost:19200/hello/_settings?pretty" 3…