SpringBoot實戰1

SpringBoot實戰1


一、開發環境,環境搭建-----創建項目

通過傳統的Maven工程進行創建SpringBoot項目
在這里插入圖片描述

(1)導入SpringBoot項目開發所需要的依賴

一個父依賴:(工件ID為:spring-boot-starter-parent

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.4</version>
</parent>

開發相關依賴

Web依賴:spring-boot-starter-web

<!--引入Web的依賴--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

Mybatis依賴:mybatis-spring-boot-starter

<!--引入Mybatis的依賴--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.4</version></dependency>

MySQL的驅動依賴:mysql-connector-j

<!--引入MySQL的驅動依賴--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency>

lombok工具依賴:

<!--lombok依賴--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency>

(2)創建基本的項目架構

Controller,Service,Mapper,POJO,utils

(3)在resources目錄下加入application.yml的SpringBoot項目配置文件,在其中加入Jdbc的相關配置

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/big_event?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTCusername: rootpassword: ****

(4)完成SQL配置,連接數據庫,同時創建數據庫表

(5)添加SpringBoot的啟動類:(項目名)XxxApplication

加上@SpringBootApplication注解確定為啟動類

@SpringBootApplication
public class BigEventApplication
{public static void main( String[] args) {SpringApplication.run(BigEventApplication.class, args);}
}

二、注冊功能實現

localhost:8080/user/register

Controller層加上@RestController—>@ResponseBody可以自動將返回值轉為JSON格式

通過Post的方式提交數據

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/register")public Result register(String username, String password){// TODO: 查詢用戶是否存在User user=userService.findByUserName(username);if (user!=null){return Result.error("用戶已存在");}else {// TODO: 用戶不存在的話就開始注冊用戶userService.register(username,password);return Result.success();}}
}

編寫對應的業務層 ,數據層的操作

public interface UserService {// 注冊void register(String username, String password) ;// 根據用戶名查詢用戶User findByUserName(String username);
}
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic void register(String username, String password) {// TODO: 對于用于的密碼進行MD5加密處理String md5Password = Md5Util.getMD5String(password);userMapper.add(username,md5Password);}@Overridepublic User findByUserName(String username) {User user =userMapper.findByUserName(username);return user;}
}
@Mapper
public interface UserMapper {// TODO: 必須加入創建時間,更新時間通過sql自帶的now()函數@Insert("insert into user(username,password,create_time,update_time)" +" values(#{username},#{password},now(),now())")void add(String username, String password);@Select("select * from user where username=#{username}")User findByUserName(String username);
}

參數校驗框架(Spring Validation)

在注冊的時候注意加上:對注冊接口的參數進行合法性校驗

使用步驟:

1、引入對應的依賴:spring-boot-starter-validation

<!-- 添加validation依賴用于參數的校驗 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2、在參數前面加上@Pattern注解(@Pattern(regexp=“正則表達式(注意Java中單斜杠不行需轉成\\)”))

public Result register(@Pattern(regexp = "^\\S{5,16}$") String username,@Pattern(regexp = "^\\S{5,16}$") String password)

3、在對應的Controller類上加上@Validated

@Validated
public class UserController

注意:如果遇到參數校驗失敗的情況的話

4、通過全局異常處理器中處理參數校驗失敗

@RestControllerAdvice//表示該類是一個全局異常處理類

@ExceptionHandler(Exception.class)//表示該方法可以處理所有異常

//  TODO: 全局異常處理
@RestControllerAdvice
public class GlobalExceptionHandler {// TODO: 捕獲所有異常@ExceptionHandler(Exception.class)public Result handleException(Exception e) {e.printStackTrace();return Result.error(StringUtils.hasLength(e.getMessage())?e.getMessage():"參數校驗失敗");}
}

三、登錄功能實現

1、在數據表中查詢用戶

2、判斷查詢到的用戶是否存在

3、用戶存在判斷密碼是否正確

//TODO: 登錄
@PostMapping("/login")
public Result login(@Pattern(regexp = "^\\S{5,16}$") String username,@Pattern(regexp = "^\\S{5,16}$") String password) {// TODO: 查詢用戶是否存在User loginUser = userService.findByUserName(username);// TODO: 判斷用戶是否存在if(loginUser==null){return Result.error("用戶不存在");}// TODO: 判斷密碼是否正確else{if(Md5Util.getMD5String(password).equals(loginUser.getPassword())){// 登錄成功return Result.success("jwt token令牌");}else {return Result.error("密碼錯誤");}}
}

登錄認證:

通過令牌技術承載業務的數據,減少后續請求查詢數據庫的次數,1、防止篡改,2、保證信息的合法性和有效性

JWT令牌:JSON Web Token(通信雙方通過JSON數據格式安全的傳輸信息)
在這里插入圖片描述

JWT組成—通過Base64的編碼格式進行編碼

1、Header頭部:記錄令牌的類型,簽名算法(用于加密算法)

2、Payload有效載荷:攜帶一些自定義的信息,默認信息–不能存放私密數據

3、Signature簽名:防止Token被篡改,確保安全性


JWT-生成:

引入JWT的依賴

<!-- 添加JWT依賴 -->
<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>4.4.0</version>
</dependency>

在單元測試中生成jwt令牌

public class JwtTest {@Testpublic void testGen(){Map<String, Object> claims =new HashMap<>();claims.put("id",1);claims.put("username","admin");//生成jwt代碼String token = JWT.create().withClaim("user", claims)//添加自定義信息(載荷).withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 12))//設置過期時間為12小時.sign(Algorithm.HMAC256("geshihua"));//指定算法,配置密鑰System.out.println(token);}
}

jwt令牌的驗證:

注意:

1、校驗jwt的簽名密鑰要和生成jwt令牌的簽名密鑰吻合

2、jwt令牌解析驗證報錯的話那么說明對應的jwt令牌被篡改了,或者生成的jwt令牌過期失效了

//TODO:jwt令牌的驗證
@Test
public void testParse(){//定義一個字符串模擬用戶傳遞過來的TokenString token ="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9" +".eyJ1c2VyIjp7ImlkIjoxLCJ1c2VybmFtZSI6ImFkbWluIn0sImV4cCI6MTc0NDMyMTkyNX0" +".wfaRNJPOvVz6sU7rsyxnyzSKdezmhyhwslp4eUW2O4g";//調用API驗證TokenJWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("geshihua")).build();//解析Token,生成一個解析后的jwt對象DecodedJWT decodedJWT = jwtVerifier.verify(token);Map<String, Claim> claims = decodedJWT.getClaims();System.out.println(claims.get("user"));
}

將JWT令牌納入登錄驗證中(登錄成功了之后將相關的信息存儲到Token中

// 登錄成功
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);

在其他的業務接口中解析驗證Token–原理

@GetMapping("/list")
public Result list(@RequestHeader(name = "Authorization") String token, HttpServletResponse response) {//驗證Tokentry {Map<String, Object> claims = JwtUtil.parseToken(token);} catch (Exception e) {response.setStatus(401);return Result.error("請先登錄");}return Result.success("獲取到對應的文章信息了!!!");
}

通過攔截器Interceptor多個接口都需要同樣的操作可以用攔截器進行實現
在這里插入圖片描述

完成對應的驗證操作,只有通過驗證的才可以進行相關的業務操作

1、先創建一個登錄校驗的攔截器(LoginInterceptor)–》需要在攔截器這個類上面加一個注解@Component(用于Bean對象注冊)

攔截器實現HanderInterceptor接口==>實現preHandle方法(意味在請求的Controller方法(請求訪問服務器)之前進行調用)

@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//在這個攔截器中驗證Token---》通過請求頭中攜帶的的tokenString token = request.getHeader("Authorization");//解析Tokentry {Map<String, Object> claims = JwtUtil.parseToken(token);//TODO:如果解析成功,則放行return true;} catch (Exception e) {response.setStatus(401);//TODO:如果解析失敗,則返回錯誤信息,并且攔截return false;}}
}

2、添加Interceptor攔截器到WebMvcConfig配置類中–》配置類需要通過注解@Component將配置類注冊到Spring的IOC容器中去

(1)WebMvcConfig配置類需要實現WebMvcConfigurer接口

(2)配置類中將登錄攔截器的Bean自動注入進來

@Autowired
private LoginInterceptor loginInterceptor;

(3)實現對應的接口方法–》用于添加對應的登錄攔截器addInterceptors

@Configuration//TODO:配置類也需要注冊到spring的IOC容器中
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;//TODO:用于攔截器注冊public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor)//TODO: 放行登錄和注冊接口,不進行攔截.excludePathPatterns("/user/login","/user/register");}
}

三、獲取用戶的詳細信息(在進行此業務請求的時候需要再請求頭中攜帶對象的token信息—Authorization)

根據用戶名查詢數據表中的用戶信息(用戶名的信息通過請求頭中的token----Authorization獲取得到)

@RequestHeader(name = "Authorization")String token

通過上面的 參數得到token攜帶的信息–》用戶名的username,id

// TODO: 獲取用戶詳細信息
@GetMapping("/userInfo")
public Result<User> userInfo(@RequestHeader(name = "Authorization")String token){//根據用戶名查詢用戶信息---》用戶名是通過token解析出來的Map<String, Object> map = JwtUtil.parseToken(token);String username = (String) map.get("username");User user = userService.findByUserName(username);return Result.success(user);
}

注意:對于數據表中存在有下劃線的字段的時候在進行查詢的時候不會自動轉化為對應的駝峰命名導致查詢不到對應的信息

解決方式一:

在配置文件中開啟駝峰映射

mybatis:configuration:map-underscore-to-camel-case: true # 開啟下劃線轉駝峰命名 自動將數據表中有下劃線字段的轉換為駝峰明明形式的

解決方式二:

在寫SQL語句的時候對于有下劃線的字段采取起別名的方式:

@Select("select id, username, password, nickname, email, user_pic as userPic, create_time as createTime, update_time as updateTime from user where username=#{username}")

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

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

相關文章

【軟考-高級】【信息系統項目管理師】【論文基礎】進度管理過程輸入輸出及工具技術的使用方法

定義 項目進度管理是為了保證項目按時完成&#xff0c;對項目中所需的各個過程進行管理的過程&#xff0c;包括規劃進度、定義活動、活動優先級排序、活動持續時間、制定進度計劃和控制進度。 管理基礎 制定進度計劃的一般步驟 選擇進度計劃方法&#xff08;如關鍵路徑法&a…

【Linux】之【Get】 chroot 環境下安裝deb包時 .postinst:行 9: 201 段錯誤 (核心已轉儲)ldconfig

背景 如題&#xff0c;在postinst文件中直接執行了ldconfig命令&#xff0c; chroot 環境下出錯&#xff0c;安裝失敗 分析 chroot 環境下不能用 ldconfig 和 systemctl 但是&#xff1a;如果環境是 chroot&#xff0c;系統有可能沒完整掛載 /proc、/dev、系統路徑&#xff…

【論文精讀與實現】EDC2-RAG:基于動態聚類的文檔壓縮方法提升檢索增強生成RAG性能

?? 向所有學習者致敬! “學習不是裝滿一桶水,而是點燃一把火。” —— 葉芝 我的博客主頁: https://lizheng.blog.csdn.net ?? 歡迎點擊加入AI人工智能社區! ?? 讓我們一起努力,共創AI未來! ?? 1. 論文核心思想 這篇由清華大學團隊提出的EDC-RAG框架,針對當前…

OSPF接口的網絡類型和不規則區域

網絡類型(數據鏈路層所使用的協議所構建的二層網絡類型) 1、MA --- 多點接入網絡 BMA --- 支持廣播的多點接入網絡 NBMA --- 不支持廣播的多點接入網絡 2、P2P --- 點到點網絡 以太網 --- 以太網最主要的特點是需要基于MAC地址進行物理尋址&#xff0c;主要是因為以太網接口所連…

HTTP代理:內容分發戰場上的「隱形指揮官」

目錄 一、技術本質&#xff1a;流量博弈中的「規則改寫者」 二、戰略價值&#xff1a;內容分發的「四維升級」 三、實戰案例&#xff1a;代理技術的「降維打擊」 四、未來進化&#xff1a;代理技術的「認知升級」 五、結語&#xff1a;代理技術的「戰略覺醒」 在數字內容爆…

(2)網絡學習之堡壘機

堡壘機和防火墻的區別&#xff1a; 1.功能定位 防火墻主要負責抵御外部攻擊&#xff0c;就像一道堅固的城墻&#xff0c;防止黑客進入內部網絡。堡壘機則專注于內部管理&#xff0c;監控和記錄運維人員的操作行為&#xff0c;確保內部網絡的安全。 2.部署位置與作用范圍 防…

minio命令行客戶端mc常見用法

安裝minio命令行客戶端mc https://min-io.cn/docs/minio/linux/reference/minio-mc-admin.html # Windows安裝minio命令行客戶端 choco install minio-client -y# Linux安裝mc客戶端 wget -c -P /usr/local/bin/ https://dl.min.io/client/mc/release/linux-amd64/mc # 賦予可…

idea調整控制臺日志顯示長度

概述 在調試時&#xff0c;idea控制臺顯示的日志有長度顯示&#xff0c;當顯示的日志太長時&#xff0c;后生成的日志會覆蓋掉之前生成的日志內容。想要調整長度就可以按以下方式進行設置。 設置方法 Settings -> Editor -> General -> Console -> Override con…

oracle em修復之路

很早以前寫的文章&#xff0c;再草稿中存放太久了&#xff0c;今天開始整理20年來工作體會&#xff0c;以后陸續發出&#xff0c;希望給大家提供小小的幫助。 去年做的項目使用的oracle數據庫&#xff0c;最近要看一下&#xff0c;啟動機器進入系統&#xff0c;出現無法加載數…

QT中怎么隱藏或顯示最大化、最小化、關閉按鈕

文章目錄 方法一&#xff1a;通過代碼動態設置1、隱藏最大化按鈕2、隱藏最小化按鈕3、隱藏關閉按鈕方法 1&#xff1a;移除 WindowCloseButtonHint方法 2&#xff1a;使用 Qt::CustomizeWindowHint 并手動控制按鈕 4、同時隱藏最大化和最小化按鈕5、同時隱藏最大化和關閉按鈕6、…

性能比拼: Redis vs Memcached

本內容是對知名性能評測博主 Anton Putra Redis vs Memcached Performance Benchmark 內容的翻譯與整理, 有適當刪減, 相關指標和結論以原作為準 在本視頻中&#xff0c;我們將對比 Redis 和 Memcached。我會介紹一些功能上的不同&#xff0c;但主要關注 性能。 首先&#xf…

P1331 洛谷 海戰

題目描述 思路 這個題需要讀懂題意&#xff0c;即“什么樣的形式表示兩只船相撞&#xff1f;” ----> 上下相鄰或左右相鄰 如果圖是不和法的&#xff0c;一定存在如下結構&#xff1a; # # . # 或 # # # . 或 # . # # 或 . # # #即四個格子里有三個#&#xff0c;一個"…

傳統項目純前端實現導出excel之xlsx.bundle.js

傳統項目純前端實現導出excel之xlsx.js 自從vue問世后&#xff0c;使得前端開發更加簡潔從容&#xff0c;極大的豐富組件樣式和頁面渲染效果&#xff0c;使得前端功能的可擴展性得到極大地加強。雖然vue的使用對于前后端分離的項目對于功能實現與擴展有了質的飛躍&#xff0c;但…

2025.04.10-拼多多春招筆試第四題

?? 點擊直達筆試專欄 ??《大廠筆試突圍》 ?? 春秋招筆試突圍在線OJ ?? 筆試突圍OJ 04. 優惠券最優分配問題 問題描述 LYA是一家電商平臺的運營經理,負責促銷活動的策劃。現在平臺上有 n n n

基于 Spring Boot 瑞吉外賣系統開發(三)

基于 Spring Boot 瑞吉外賣系統開發&#xff08;三&#xff09; 分類列表 靜態頁面 實現功能所需要的接口 定義Mapper接口 Mapper public interface CategoryMapper extends BaseMapper<Category> {}定義Service接口 public interface CategoryService extends ISe…

FlinkSQL的常用語言

FlinkSQL 常用語言指南 FlinkSQL 是 Apache Flink 提供的 SQL 接口&#xff0c;允許用戶使用標準 SQL 或擴展的 SQL 語法來處理流式和批式數據。以下是 FlinkSQL 的常用語言元素和操作&#xff1a; 基本查詢 -- 選擇查詢 SELECT * FROM table_name;-- 帶條件的查詢 SELECT c…

spring mvc異步請求 sse 大文件下載 斷點續傳下載Range

學習連接 異步Servlet3.0 Spring Boot 處理異步請求&#xff08;DeferredResult 基礎案例、DeferredResult 超時案例、DeferredResult 擴展案例、DeferredResult 方法匯總&#xff09; spring.io mvc Asynchronous Requests 官網文檔 spring.io webflux&webclient官網文…

一問看懂——支持向量機SVM(Support Vector Machine)

目錄 蕪湖~~~支持向量機&#xff08;SVM&#xff09; 1. 引言 2. 基本思想 3. 數學模型 3.1 超平面定義 3.2 分類間隔與目標函數 3.3 軟間隔與松弛變量 4. 核函數方法&#xff08;Kernel Trick&#xff09; 4.1 核函數定義 4.2 常用核函數 5. SVM 的幾種類型 6. SV…

藍橋杯 拼數(字符串大小比較)

題目描述 設有 n 個正整數 a1?…an?&#xff0c;將它們聯接成一排&#xff0c;相鄰數字首尾相接&#xff0c;組成一個最大的整數。 輸入格式 第一行有一個整數&#xff0c;表示數字個數 n。 第二行有 n 個整數&#xff0c;表示給出的 n 個整數 ai?。 輸出格式 一個正整…

Elasticsearch 系列專題 - 第三篇:搜索與查詢

搜索是 Elasticsearch 的核心功能之一。本篇將介紹如何構建高效的查詢、優化搜索結果,以及調整相關性評分,幫助你充分發揮 Elasticsearch 的搜索能力。 1. 基礎查詢 1.1 Match Query 與 Term Query 的區別 Match Query:用于全文搜索,會對查詢詞進行分詞。 GET /my_index/_…