蒼穹外賣Day06筆記(復習了jwt的加密解密和傳遞)

瘋玩了一個月,效率好低,今天開始撿起來蒼穹外賣~

1. 為什么不需要單獨引入HttpClient的dependency?

? ? ? ? 因為我們在sky-common的pom.xml中已經引入了aliyun-sdk-oss的依賴,而這個依賴低層就引入了httpclinet的依賴,根據依賴傳遞的原則,不需要單獨再引入了

HttpClient的maven坐標

<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version>
</dependency>

2. 操作HttpClient請求發送的步驟

  • 創建HttpClient對象

  • 創建Http請求對象

  • 調用HttpClient的execute方法發送請求

3. 微信登錄功能需求和接口設計

4.?基于微信登錄實現小程序的登錄功能(如果是新用戶則自動完成注冊)

(1)接口設計

?這個請求實現了“微信登錄過程流程圖”中的哪個部分?

(2)如果是新用戶,則實現自動注冊。在后端還得設計user表來存儲用戶信息

?(3)代碼開發

1)在application-dev.yml和application.yml中配置微信登錄需要的配置項

2)在application.yml中配置為微信用戶生成jwt令牌的配置項

  • admin-secret-key:管理端設置jwt簽名時使用的秘鑰
  • user-secret-key:用戶端設置jwt簽名時使用的秘鑰

在JWT中,秘鑰用于簽名JWT以確保其完整性和真實性。JWT通常由三部分組成:頭部(Header)、載荷(Payload)、簽名(Signature)。在創建JWT時,會將頭部和載荷進行Base64編碼,然后用秘鑰對編碼后的頭部和載荷進行簽名,生成簽名部分

簽名過程:
  1. 創建 JWT 的頭部(Header)和載荷(Payload)。
  2. 將頭部和載荷編碼為 JSON 字符串,并使用 Base64 編碼。
  3. 將編碼后的頭部和載荷通過一個字符(如".")連接起來形成一個字符串。
  4. 使用選定的加密算法(如HMAC、RSA、md5等)和預先配置的秘鑰對上一步生成的字符串進行簽名,生成簽名部分。
  5. 將簽名添加到JWT的尾部,生成最終的JWT。
驗證過程:
  1. 接收到JWT后,將其分解為頭部、載荷和簽名三部分。
  2. 將頭部和載荷進行相同的編碼處理以及連接操作,生成一個字符串。
  3. 使用相同的加密算法和預先配置的秘鑰對生成的字符串進行簽名,生成一個新的簽名。
  4. 新生成的簽名與JWT中的簽名進行比較。如果兩者相匹配,則JWT是有效的。
  • admin-token-name和user-token-name

? ? ? ? 對于管理員身份的JWT,前端應該使用名為"token"的字段來傳遞JWT

? ? ? ? 對于用戶身份的JWT,前端用名為“authentication”的字段來傳遞JWT

????????

3)設計VO和DTO

發送的請求中有參數,接收參數需要DTO

VO用來接收返回數據

4)根據接口定義創建Controller方法

@RestController
@RequestMapping("/user/user")
@Api(tags = "C端用戶相關接口")
@Slf4j
public class UserController {@Autowiredprivate UserService userService;@Autowiredprivate JwtProperties jwtProperties;/*** 微信登錄* @param userLoginDTO* @return*/@PostMapping("/login")@ApiOperation("微信登錄")public Result<UserLoginVO> login(@RequestBody UserLoginDTO userLoginDTO){log.info("微信用戶登錄:{}",userLoginDTO.getCode());// 微信登錄User user = userService.wxLogin(userLoginDTO);// 為微信用戶生成jwt令牌Map<String,Object> claims = new HashMap<>();claims.put(JwtClaimsConstant.USER_ID,user.getId());String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);UserLoginVO userLoginVO = UserLoginVO.builder().id(user.getId()).openid(user.getOpenid()).token(token).build();return Result.success(userLoginVO);}

5) Service方法——傳入微信登錄授權碼,返回id、openid和token

public interface UserService {/*** 微信登錄* @param userLoginDTO* @return*/User wxLogin(UserLoginDTO userLoginDTO);
}

6) ServiceImpl——獲得微信用戶openid、返回id、openid、token方法的實現類

發送請求,傳入微信登錄授權碼,獲得微信用戶的openid.

調用微信接口服務、傳給微信服務端的數據都被封裝在map里

/*** 調用微信接口服務,獲取微信用戶的openid* @param code* @return*/private String getOpenid(String code){Map<String, String> map = new HashMap<>();map.put("appid",weChatProperties.getAppid());map.put("secret",weChatProperties.getSecret());map.put("js_code", code);map.put("grant_type","authorization_code");String json = HttpClientUtil.doGet(WX_LOGIN, map);JSONObject jsonObject = JSON.parseObject(json);String openid = jsonObject.getString("openid");return openid;}

獲取到openid之后,就可以實現微信登錄

/*** 微信登錄* @param userLoginDTO* @return*/public User wxLogin(UserLoginDTO userLoginDTO){// 調用微信接口服務,獲得當前微信用戶的openidString openid = getOpenid(userLoginDTO.getCode());// 判斷openid是否為空,如果是空表示登錄失敗,拋出業務異常if(openid == null){throw new LoginFailedException(MessageConstant.LOGIN_FAILED);}// 判斷當前用戶是否是新用戶User user = userMapper.getByOpenid(openid);// 如果是新用戶,自動完成注冊if(user == null){user = User.builder().openid(openid).createTime(LocalDateTime.now()).build();userMapper.insert(user);}// 返回這個用戶對象return user;}

7) UserMapper的建立

為了在ServiceImpl中判斷用戶是否已經注冊,需要獲得user表的信息,因此我們創建UserMapper,以便能夠通過openid查詢用戶是否已經注冊

@Select("select * from user where openid = #{openid}")User getByOpenid(String openid);

將新用戶插入user表的功能實現

    /*** 插入數據* @param user*/void insert(User user);

還需要再userMapper.xml中添加insert語句

    <insert id="insert" useGeneratedKeys="true" keyProperty="id">insert into user (openid, name, phone, sex, id_number, avatar, create_time)values (#{openid}, #{name}, #{phone}, #{sex}, #{idNumber}, #{avatar}, #{createTime})</insert>

8) 編寫用戶JWT的攔截器

5. 商品瀏覽功能的需求分析

6. 查詢分類

后面還有根據分類id查詢菜品、根據分類id查詢套餐、根據套餐id查詢菜品的功能,答案都在黑馬的文檔里面

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

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

相關文章

C語言從頭學05——頭文件及庫文件

我們寫"Hello World!"程序時&#xff0c;一上來先寫了一句代碼&#xff1a; #include <stdio.h> 我們看上面這條代碼&#xff0c;前面有個"#"號后邊沒有";"號&#xff0c;這樣的代碼不是普通的C語言代碼&#xff0c;它屬于預處理命令。這…

代碼隨想錄算法訓練營第六天| 242. 有效的字母異位詞、349. 兩個數組的交集、202. 快樂數、1. 兩數之和

哈希表理論基礎 [LeetCode] 242. 有效的字母異位詞 [LeetCode] 242. 有效的字母異位詞 文章解釋 [LeetCode] 242. 有效的字母異位詞 視頻解釋 題目: 給定兩個字符串 s 和 t &#xff0c;編寫一個函數來判斷 t 是否是 s 的字母異位詞。 注意&#xff1a;若 s 和 t 中每個字符出…

JavaEE技術之SpringCloud(Nacos注冊中心、Nacos配置中心、Sentinel實現熔斷與限流)

文章目錄 SpringCloud Alibaba1、簡介1.1 背景1.2 Nacos主要功能1.3 Nacos和SpringBoot、SpringCloud版本選擇 2、Nacos注冊中心2.1 案例準備2.2 Nacos注冊中心下載啟動2.2.1 下載2.2.2 解壓啟動2.2.3 nacos-server訪問測試 2.3 nacos注冊中心客戶端整合2.3.1 訂單服務整合naco…

YTU 3166 共享單車 DFS 記憶化搜索

問題 D: 共享單車 題目描述 共享單車走進煙臺&#xff0c;小明決定嘗試。小明啟動共享單車 App&#xff0c;輕松地找到附近的單車。那么問題來了&#xff0c;到最近的那輛單車&#xff0c;小明大約要走多少米呢&#xff1f; 現在簡化問題。將地圖設定成一個由 100100 米的像…

【UE】仿原神實現無限道路延伸的開場效果

目錄 效果 步驟 一、無限生成磚塊 二、制作門 三、停止移動并生成門 四、進入門 效果 步驟 一、無限生成磚塊 1. 新建一個Basic關卡&#xff0c;再新建一個Pawn類&#xff0c;這里命名為“BP_MyPawn” 打開“BP_MyPawn”&#xff0c;添加一個膠囊體碰撞組件和一個攝像…

工器具管理(基于若依)

文章目錄 前言一、工器具管理項目總覽 二、入庫功能1. 前端1.1 界面展示1.2 具體操作實現1.3 js文件 2. 后端2.1 工器具信息回顯2.2 工器具入庫 三、領用功能1. 前端1.1 界面展示1.2 具體實現操作1.3 js文件 2. 后端2.1 工器具信息回顯2.2 工器具領用 遇到的問題1. 同一頁面展示…

pat乙1033-舊鍵盤打字

1測試點2&#xff1a; 輸入的字符串如果為空&#xff0c;要用getline(cin,s)&#xff0c;而不是cin>>s&#xff0c;否則程序做不了 2題目說的如果上鍵壞了那大寫字母打印不了&#xff0c;不是大寫轉小寫打印啦&#xff0c;認真讀題 3兩個for循環長這樣&#xff0c;break…

基于springboot+vue的自習室管理和預約系統(全套)

一、系統架構 前端&#xff1a;vue | element-ui | html 后端&#xff1a;springboot | mybatis-plus 環境&#xff1a;jdk1.8 | mysql | maven | nodejs 二、代碼及數據庫 三、功能介紹 01. web端-首頁1 02. web端-首頁2 03. web端-注冊 04. web端-登錄 05. w…

牛客Linux高并發服務器開發學習第六天

目錄相關函數 學習進度&#xff1a; Linux系統編程入門 06&#xff1a;59&#xff1a;42

Apollo9.0 Control模塊算法源碼學習

參考資料 Apollo控制算法_嗶哩嗶哩_bilibili

Python自動化測試 | 如何使用Robot Framework進行自動化測試?

你還在手動測試&#xff1f;不妨了解一下更高效、準確且簡單的測試方法——使用Python的Robot Framework進行自動化測試。 什么是Robot Framework&#xff1f; Robot Framework是一款開源的Python自動化測試框架&#xff0c;它基于關鍵字驅動的思想&#xff0c;具有易讀、易擴…

每日一題 城市群的數量

題目解析 城市群數量_牛客題霸_牛客網 當解決這個問題時&#xff0c;首先需要理解題目要求。題目中給出了一個城市之間的鄰接矩陣&#xff0c;矩陣中的元素表示城市之間是否直接相連。如果兩個城市直接相連&#xff0c;或者通過其他城市間接相連&#xff0c;它們就屬于同一個城…

算法學習筆記(匈牙利算法)

匈牙利算法可以求解二分圖的最大匹配問題&#xff08;二分圖&#xff1a;如果無向圖 G ( V , E ) G (V, E) G(V,E)的所有點可以分為兩個集合 V 1 、 V 2 V_1、V_2 V1?、V2?&#xff0c;所有的邊都在 V 1 V_1 V1?和 V 2 V_2 V2?之間&#xff0c;而 V 1 V_1 V1?或 V 2 V_2…

深入理解Python的類,實例和type函數

問題起源&#xff1a; class t():pass s1 t() s2 type("Student2",(),{}) isinstance(s1, type), isinstance(s2, type)為什么第一個是false&#xff0c;第二個是true呢 根因定位&#xff1a; 在Python中&#xff0c;一切皆對象&#xff0c;類是對象&#xff0c…

nacos在沒有指定數據源的情況下默認使用什么數據庫?

在沒有特別指定數據源的情況下&#xff0c;Nacos 默認使用內嵌的數據庫 Derby 來存儲其數據。Derby 是一個輕量級的、基于 Java 的數據庫管理系統&#xff0c;適合于開發和測試環境&#xff0c;因為它簡單易部署且無需額外的數據庫服務器。然而&#xff0c;對于生產環境&#x…

使用ORM快速獲取業務對象列表

通常在實際開發中&#xff0c;業務對象的信息是需要來自多個數據表的。 我們如果想要獲取這個業務對象&#xff0c;就要先查詢數據表&#xff0c;再把查詢到的數據依次循環&#xff0c;組合轉換封裝成業務要使用的對象類型列表。 如果使用了ORM&#xff0c;那么這個過程就可以簡…

Stability AI 推出 Stable Artisan,終于可以在Discord上使用Stable Diffusion了!

Stable Diffusion 社區最常見的要求之一是能夠直接在 Discord 上使用他們的模型。近期&#xff0c;Stability AI 推出 Stable Artisan&#xff0c;這個需求終于被實現了。 Stable Artisan 支持在 Discord 上生成媒體&#xff0c;由 Stability AI 的尖端圖像和視頻模型 Stable D…

基于Springboot的實習生管理系統(有報告)。Javaee項目,springboot項目。

演示視頻&#xff1a; 基于Springboot的實習生管理系統&#xff08;有報告&#xff09;。Javaee項目&#xff0c;springboot項目。 項目介紹&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三層體系結構&a…

mysql group by使用方法實例講解

MySQL中GROUP BY語句用于對某個或某些字段查詢分組&#xff0c;并返回重復記錄的第一條&#xff0c;本文章通過實例向大家介紹mysql group by使用方法和需要注意的地方&#xff0c;感興趣的朋友可以參考一下。 現在有這樣一個數據表book idfirst_namelast_namecityage1JasonM…

知乎知+廣告推廣該如何做?怎么收費?

知乎作為一個匯聚高質量用戶群體的知識分享平臺&#xff0c;成為了眾多品牌和產品推廣的優選之地。特別是知乎的“知”廣告推廣服務&#xff0c;以其精準定向、內容原生的特點&#xff0c;深受廣告主青睞。 一、知乎知廣告推廣基礎 1. 什么是知乎知&#xff1f; 知是知乎官方…