【Java項目安全基石】登錄認證實戰:Session/Token/JWT用戶校驗機制深度解析


目錄

1.前言

2.正文

2.1Cookie—Session機制

2.1.1核心原理圖解:

2.1.2四步核心流程:

2.1.3存儲架構對比

2.1.4集群部署方案(Spring Session + Redis)

2.2Token令牌

2.2.1核心原理圖解:

2.2.2四步核心流程:

2.2.3安全架構設計

2.3JWT令牌驗證

2.3.1核心原理圖解:

2.3.2JWT結構

2.3.3安全風險與解決方案

2.3.4簽名算法對比

2.4三種方案對比

2.4.1核心機制對比表

2.4.2安全性與控制力對比

2.4.3性能與擴展性對比

2.4.4開發復雜度對比

2.4.5典型應用場景推薦

3.小結


1.前言

登錄認證是系統安全的門戶,而會話的持續管理策略直接影響開發效率與系統健壯性。許多開發者在實踐中常陷入困惑:

  • 為何Session在集群部署時突然失效?

  • Token與JWT看似相似,核心差異究竟在哪?

  • 如何避免常見的安全陷阱?

本文針對主流場景,從底層原理剖析Session、Token、JWT三大用戶校驗方案,結合Java代碼實現與安全規范,詳解其工作機制、適用邊界及落地要點。無論您是構建傳統Web應用還是前后端分離項目,均可獲得可直接復用的實踐方案。


插播一條消息~

🔍?十年經驗淬煉 · 系統化AI學習平臺推薦

系統化學習AI平臺https://www.captainbed.cn/scy/

  • 📚 完整知識體系:從數學基礎 → 工業級項目(人臉識別/自動駕駛/GANs),內容由淺入深
  • 💻 實戰為王:每小節配套可運行代碼案例(提供完整源碼)
  • 🎯 零基礎友好:用生活案例講解算法,無需擔心數學/編程基礎

🚀 特別適合

  • 想系統補強AI知識的開發者
  • 轉型人工智能領域的從業者
  • 需要項目經驗的學生

2.正文

在正式講解常見的登錄驗證方式,先看看無驗證的登陸流程是怎樣的。

核心邏輯:

致命缺陷:

1.零身份驗證

  • 攻擊者輸入任意有效用戶名(無需密碼)即可登錄他人賬戶。
  • 示例:輸入?admin?直接獲取管理員權限。

2.會話劫持風險

  • 未登錄用戶訪問?/profile?接口導致空指針異常(無用戶信息)。
  • 若會話ID被竊取(如XSS攻擊),攻擊者可直接復用會話。

3.越權操作

  • 用戶A登錄后,修改URL參數即可操作用戶B的數據(如?/deleteUser?id=2)。

2.1Cookie—Session機制

2.1.1核心原理圖解:

2.1.2四步核心流程:

  1. 會話創建階段

    • 用戶提交有效憑證(用戶名+密碼)

    • 服務端驗證通過后:

      // Java Servlet示例
      HttpSession session = request.getSession(true); // 創建新會話
      session.setAttribute("user", userObject); // 存儲用戶對象
      session.setMaxInactiveInterval(30*60); // 設置30分鐘超時
    • 生成唯一Session ID(如JSESSIONID)

  2. Cookie傳遞階段

    • 服務端響應頭包含:

      HTTP/1.1 200 OK
      Set-Cookie: JSESSIONID=5A8C3D9F1E7B2; Path=/; HttpOnly; Secure; SameSite=Lax
    • 關鍵屬性:

      • HttpOnly:阻止JavaScript訪問

      • Secure:僅HTTPS傳輸

      • SameSite:防御CSRF攻擊

  3. 會話保持階段

    • 客戶端后續請求自動攜帶Cookie:

      GET /profile HTTP/1.1
      Cookie: JSESSIONID=5A8C3D9F1E7B2
    • 服務端校驗流程:

      public boolean checkSession(HttpServletRequest request) {HttpSession session = request.getSession(false); // 不創建新會話if(session == null) {return false; // 會話不存在}User user = (User)session.getAttribute("user");return user != null; // 用戶對象存在
      }
  4. 會話銷毀階段

    • 主動注銷:

      session.invalidate(); // 立即銷毀會話
    • 超時銷毀(web.xml配置):

      <session-config><session-timeout>30</session-timeout> <!-- 單位:分鐘 -->
      </session-config>

2.1.3存儲架構對比

存儲方式實現方案優點缺點
內存存儲Web容器默認(Tomcat等)零配置、響應快單點故障、集群失效
Redis存儲Spring Session + Redis分布式支持、高性能需額外中間件
數據庫存儲自定義Session表持久化可靠、數據完整性能低、需清理機制
文件存儲序列化到文件系統簡單易實現I/O瓶頸、擴展性差

2.1.4集群部署方案(Spring Session + Redis)

  1. 依賴配置

    <dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId>
    </dependency>
  2. 配置類

    @EnableRedisHttpSession 
    public class SessionConfig {@Beanpublic LettuceConnectionFactory connectionFactory() {return new LettuceConnectionFactory(); }
    }
  3. 會話存取原理


Cookie-Session機制在傳統Web應用中保持不可替代地位,通過嚴格的會話管理策略和集群擴展方案,可構建安全可靠的用戶認證體系。?

2.2Token令牌

2.2.1核心原理圖解:

2.2.2四步核心流程:

1. Token生成階段

// 生成強隨機Token(示例)
public String generateToken() {// 使用SecureRandom保證加密強度SecureRandom random = new SecureRandom();byte[] bytes = new byte[32];random.nextBytes(bytes);return Base64.getUrlEncoder().withoutPadding().encodeToString(bytes);
}// 存儲關聯關系(Redis示例)
public void storeToken(String token, User user) {// 設置Token有效期(如2小時)redisTemplate.opsForValue().set("AUTH_TOKEN:" + token, user.getId(),2, TimeUnit.HOURS);
}

2. Token傳遞方式

傳遞方式

實現示例

適用場景

Header傳遞

Authorization: Bearer xyz

前后端分離項目(主流)

URL參數

/api/data?token=xyz

臨時調試(不安全)

POST Body

{ "token": "xyz" }

特殊接口場景

Cookie存儲

Set-Cookie: token=xyz

兼容傳統Web應用

3. 服務端驗證流程

// Token驗證攔截器
public class TokenInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 1. 從Header獲取TokenString token = request.getHeader("Authorization");if(token == null || !token.startsWith("Bearer ")) {response.setStatus(401);return false;}token = token.substring(7);// 2. 查詢Redis驗證String userId = redisTemplate.opsForValue().get("AUTH_TOKEN:" + token);if(userId == null) {response.setStatus(401);return false;}// 3. 加載用戶數據User user = userService.findById(userId);if(user == null) {response.setStatus(401);return false;}// 4. 設置安全上下文SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities()));return true;}
}

4. Token注銷機制

// 主動注銷
@PostMapping("/logout")
public ResponseEntity logout(@RequestHeader("Authorization") String token) {token = token.replace("Bearer ", "");redisTemplate.delete("AUTH_TOKEN:" + token);return ResponseEntity.ok().build();
}// 自動過期(依賴Redis TTL)
// 可通過定時任務清理過期Token

2.2.3安全架構設計

1. 防御令牌劫持

攻擊類型防御措施實現方案
XSS攻擊HttpOnly Cookie存儲Set-Cookie: token=xyz; HttpOnly
中間人攻擊強制HTTPS傳輸服務端校驗請求協議
CSRF攻擊校驗Origin頭+CORS策略response.setHeader("Access-Control-Allow-Origin", "trusted.com")

2. 令牌綁定策略

// 設備指紋綁定
public String generateDeviceFingerprint(HttpServletRequest req) {String ip = req.getRemoteAddr();String userAgent = req.getHeader("User-Agent");return DigestUtils.sha256Hex(ip + userAgent);
}// 存儲時綁定
redisTemplate.opsForValue().set("AUTH_TOKEN:" + token, user.getId() + "|" + deviceFingerprint, 2, TimeUnit.HOURS
);// 驗證時檢查
String[] parts = storedValue.split("\\|");
if(!parts[1].equals(currentDeviceFingerprint)) {// 異常設備訪問,強制注銷redisTemplate.delete("AUTH_TOKEN:" + token);return false;
}

Token機制為現代分布式架構提供了靈活的身份驗證方案。通過嚴格的密鑰管理、傳輸加密和存儲安全措施,可構建高性能、可擴展的認證體系,特別適合API驅動的前后端分離應用。

2.3JWT令牌驗證

2.3.1核心原理圖解:


2.3.2JWT結構

JWT由三部分組成,以點分隔:Header.Payload.Signature

1. Header(頭部)

{"alg": "HS256",   // 簽名算法(HS256/RSA等)"typ": "JWT"      // 令牌類型
}
  • Base64Url編碼后形成第一部分

2. Payload(載荷)

{"sub": "1234567890",      // 標準聲明(subject)"name": "John Doe",       // 自定義聲明"iat": 1516239022,        // 簽發時間(issued at)"exp": 1516239322         // 過期時間(expiration)
}

標準聲明字段:

字段全稱說明
issIssuer簽發者
subSubject主題(用戶ID)
audAudience接收方
expExpiration Time過期時間(時間戳)
nbfNot Before生效時間(時間戳)
iatIssued At簽發時間(時間戳)
jtiJWT ID唯一標識(防重放)

3. Signature(簽名)

// 偽代碼示例
signature = HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secretKey
)
  • 防止數據篡改的核心保障

  • 算法可選:HS256(對稱)/ RS256(非對稱)


代碼實現:

1. 生成JWT

// 依賴
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtime 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtime 'io.jsonwebtoken:jjwt-jackson:0.11.5'// 生成代碼
String secretKey = "your-256-bit-secret"; // 實際應使用安全隨機生成String jwt = Jwts.builder().setSubject("user123")                 // 用戶標識.claim("name", "John Doe")             // 自定義聲明.claim("role", "ADMIN").setIssuedAt(new Date())               // 簽發時間.setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 1小時過期.signWith(SignatureAlgorithm.HS256, secretKey) // 簽名算法.compact();

2. 驗證JWT

public boolean validateToken(String jwt) {try {Claims claims = Jwts.parserBuilder().setSigningKey(secretKey)   // 設置密鑰.build().parseClaimsJws(jwt)        // 解析并驗證簽名.getBody();// 手動校驗過期時間(庫自動校驗exp,此處演示邏輯)Date expiration = claims.getExpiration();if(expiration.before(new Date())) {throw new ExpiredJwtException(null, claims, "Token expired");}// 獲取用戶信息String username = claims.getSubject();String role = claims.get("role", String.class);return true;} catch (JwtException e) {// 處理各種異常:簽名無效/過期/格式錯誤等return false;}
}

2.3.3安全風險與解決方案

1. 令牌泄露風險

  • 問題:JWT一旦泄露,在有效期內可被濫用

  • 解決方案

    // 短有效期Access Token + 長有效期Refresh Token
    String accessToken = generateToken(30 * 60); // 30分鐘
    String refreshToken = generateToken(7 * 24 * 60 * 60); // 7天// 服務端存儲Refresh Token(Redis)
    redisTemplate.opsForValue().set("REFRESH:" + userId, refreshToken, 7, TimeUnit.DAYS
    );

2. 無法即時注銷

  • 問題:服務端無法主動使JWT失效

  • 解決方案

    // 令牌黑名單(短期)
    @PostMapping("/logout")
    public void logout(@RequestHeader("Authorization") String token) {token = token.replace("Bearer ", "");long exp = getExpirationFromToken(token); // 從JWT提取過期時間long ttl = exp - System.currentTimeMillis() / 1000;if(ttl > 0) {// 將未過期的Token加入黑名單redisTemplate.opsForValue().set("BLACKLIST:" + token, "revoked", ttl, TimeUnit.SECONDS);}
    }// 驗證時檢查黑名單
    if(redisTemplate.hasKey("BLACKLIST:" + token)) {throw new JwtException("Token revoked");
    }
    

3. 敏感數據暴露

  • 問題:Payload數據可被Base64解碼查看

  • 解決方案

    // 方案1:僅存儲用戶ID
    .setSubject("user123")// 方案2:使用JWE加密(JSON Web Encryption)
    String jwe = Jwts.builder().setSubject("user123").encryptWith(Key, keyAlg, encAlg) // 加密配置.compact();

2.3.4簽名算法對比

算法類型代表算法密鑰要求適用場景
對稱HS256服務端保存相同密鑰內部服務、單點部署
非對稱RS256私鑰簽名/公鑰驗證多系統集成、開放平臺
現代EdDSA高效橢圓曲線簽名高安全性要求場景

JWT為分布式系統提供了無狀態身份驗證方案,通過標準化結構實現跨語言/跨平臺支持。在實施時必須配合短有效期、HTTPS傳輸、黑名單機制等安全措施,才能發揮其最大價值。

2.4三種方案對比

2.4.1核心機制對比表

對比維度Session-Cookie自定義TokenJWT
工作原理服務端存儲會話狀態
客戶端存Session ID
服務端存儲Token-用戶映射
客戶端存Token
無狀態令牌
自包含簽名驗證
狀態管理有狀態(服務端存儲)有狀態(服務端存儲)無狀態(服務端不存儲)
數據結構會話ID(通常128bit)隨機字符串(通常32-64字節)結構化JSON(Header.Payload.Signature)
客戶端存儲Cookie(自動管理)LocalStorage/手動管理LocalStorage/手動管理
傳輸方式自動Cookie頭手動Authorization頭手動Authorization頭
典型應用場景傳統Web應用(JSP/Thymeleaf)前后端分離API服務微服務/跨域認證/SSO

2.4.2安全性與控制力對比

安全特性Session-Cookie自定義TokenJWT
CSRF防護? 需額外Anti-CSRF Token? 天然免疫? 天然免疫
XSS防護? HttpOnly Cookie? LocalStorage易受XSS攻擊? LocalStorage易受XSS攻擊
令牌泄露影響中(會話可即時終止)中(可刪除服務端Token)(有效期無法提前終止)
數據暴露風險低(僅ID在客戶端)低(僅標識符在客戶端)中高(Payload可解碼查看)
即時注銷能力??session.invalidate()? 刪除Redis記錄? 需額外黑名單機制
防重放攻擊? 需額外措施? 綁定設備指紋? JTI聲明+短期有效期

2.4.3性能與擴展性對比

性能指標Session-Cookie自定義TokenJWT
服務端開銷會話存儲查詢(內存/Redis)Token存儲查詢(Redis)僅簽名驗證(無存儲查詢)
網絡開銷低(僅傳Session ID)中(傳完整Token)高(傳完整JWT,體積最大)
集群擴展需Session共享(如Redis)需Token存儲共享完美支持(無狀態設計)
跨域支持? 需復雜CORS配置? 簡單CORS配置? 簡單CORS配置
移動端適配困難(Cookie管理問題)優秀優秀
第三方集成困難中等優秀(標準化格式)

2.4.4開發復雜度對比

開發環節Session-Cookie自定義TokenJWT
服務端實現簡單(框架原生支持)中等(需自建驗證邏輯)復雜(密鑰管理/黑名單/Refresh機制)
前端集成零配置(瀏覽器自動管理)手動存儲/攜帶Token手動存儲/攜帶JWT
分布式會話復雜(需Spring Session等)簡單(Redis直連)無需實現
調試難度低(Cookie可見)中(需查看網絡請求)高(需解析JWT內容)
標準規范RFC 7519標準

2.4.5典型應用場景推薦

場景推薦方案原因說明
傳統企業OA系統Session-Cookie內部網絡環境安全,需嚴格會話控制,多頁面跳轉體驗流暢
電商平臺(前后端分離)自定義Token需兼顧API性能和移動端支持,高頻查詢需要快速驗證
微服務架構JWT服務間無狀態通信,避免會話共享瓶頸,網關統一認證
第三方開放平臺JWT + OAuth2標準化令牌格式,合作伙伴系統可自主驗證
高安全金融系統Session + 雙因素認證需要即時會話終止能力,配合生物識別等強認證手段
物聯網設備認證JWT(RS256)設備資源有限,非對稱簽名降低服務端壓力,長期有效減少驗證頻率

3.小結

用戶校驗機制的選擇本質是安全性、擴展性與開發成本的三角博弈

  1. 傳統Session方案在服務端強狀態控制場景仍具優勢,但需通過Spring Session+Redis解決分布式一致性痛點;

  2. 自定義Token以服務端存儲換取架構靈活性,是RESTful API服務的均衡之選;

  3. JWT的無狀態特性天然契合微服務,但必須通過“短時效Access Token+服務端管控的Refresh Token”組合彌補注銷缺陷;

無論何種方案,HTTPS傳輸、敏感數據脫敏、憑證安全存儲是必須堅守的底線。技術決策應始于架構訴求,終于安全實踐,方能在業務迭代中構建穩固的認證基石。

今天的分享到這里就結束了,喜歡的小伙伴點點贊點點關注,你的支持就是對我最大的鼓勵,大家加油!

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

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

相關文章

融合優勢:SIP 廣播對講聯動華為會議 全場景溝通響應提速?

SIP 廣播對講與華為視頻會議融合解決方案&#xff0c;是基于 SIP 協議將廣播對講系統與華為視頻會議系統進行整合&#xff0c;實現通信資源共享與業務流程聯動&#xff0c;可提升應急響應效率與溝通協作能力。融合原理&#xff1a;SIP 是一種基于文本的應用層協議&#xff0c;具…

Milvus Dify 學習筆記

目錄 docker方式&#xff1a; 模式一&#xff1a;Milvus Lite linux docker方式&#xff1a; 下載yml文件&#xff0c; https://github.com/milvus-io/milvus/releases docker啟動&#xff1a; docker compose up -d from pymilvus import connections connections.conne…

汽車ECU控制器通信架構

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

【Linux】基本指令(入門篇)(上)

目錄 前言 1.目錄操作指令 1.1指令 1.2理論 1.2.1文件 1.2.2目錄與路徑 2.文件操作指令 2.1指令 2.2理論 2.2.1輸出與輸入 2.2.2一切皆文件 前言 這是Linux學習下的第一篇文章&#xff0c;后續Linux的學習也會持續更新分享。 Linux的基本指令是使用Linux操作系統的基礎…

正向代理與反向代理理解

問&#xff1a; 應用a請求ng&#xff0c;然后ng根據不同請求路徑將請求轉發到不同的服務器&#xff0c;對于應用a來說這個ng是正向代理角色還是反向代理呢&#xff1f; 答&#xff1a; 在這個場景中&#xff0c;Nginx 扮演的是反向代理的角色&#xff0c;而不是正向代理。以下是…

【Kafka】深入理解 Kafka MirrorMaker2 - 實戰篇

文章目錄一、把“家伙事兒”都備齊二、部署其實很簡單三、配置 MirrorMaker2四、修改啟動腳本五、集群啟動與驗證六、這集群“結實”嗎&#xff1f;聊聊它的高可用它沒有“大腦”&#xff0c;但活得很好極限測試&#xff1a;干掉兩個節點會怎樣&#xff1f;寫在最后最近在跟 Ka…

借助AI學習開源代碼git0.7之四update-cache

借助AI學習開源代碼git0.7之四update-cache update-cache.c 主要負責對索引&#xff08;index&#xff09;&#xff0c;也即緩存&#xff08;cache&#xff09;&#xff0c;進行增、刪、改操作。現在的高層命令 git add 的部分核心功能就是由這個代碼實現的。 核心功能 該程序的…

【48】MFC入門到精通——MFC 文件讀寫總結 CFile、CStdioFile、CFileDialog

文章目錄1 打開文件1.2 打開文件模式總結2 常用函數2.1 寫文件2.2 讀文件2.3 獲取文件長度3. 文件打開讀寫實力3.1 寫文件 覆蓋寫3.2 文尾追加寫3.3 換行寫4 文件對話框 CFileDialog4.2 文件對話框實例5 CStdioFile 類 讀寫CStingMFC提供了一個文件操作的基類CFile&#xff0c;…

Leetcode 124. 二叉樹中的最大路徑和

遞歸/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode…

MTSC2025參會感悟:手工測試用例的智能化生成

目錄 一、測試用例生成的時代困境與 AI 機遇 1.1 傳統手工測試用例的固有痛點 1.2 AI 時代的測試新挑戰 1.3 智能化轉型的機遇窗口 二、智能用例生成的核心特性與產品功能 2.1 核心特性解析 2.2 四大核心產品功能 功能一&#xff1a;基于 PRD 理解的一鍵生成用例 功能二…

后臺管理系統登錄模塊(雙token的實現思路)

最近在寫后臺管理&#xff0c;這里分享一下我的登錄模塊的實現&#xff0c;我是使用reacttypescript實現的&#xff0c;主要是登錄的邏輯和雙token的處理方式&#xff0c;請求接口的二次封裝aixos1.首先我們需要渲染登錄界面的窗口&#xff0c;這個很簡單就不詳細講解了&#x…

第十四講 | AVL樹實現

AVL樹實現一、AVL的概念二、AVL樹的實現1、AVL樹的結構2、AVL樹的插入&#xff08;1&#xff09;、AVL樹插入一個值的大概過程&#xff08;2&#xff09;、平衡因子更新更新原則更新停止條件插入結點及更新平衡因子的代碼實現3、旋轉&#xff08;1&#xff09;、旋轉的原則&…

《P3398 倉鼠找 sugar》

題目描述小倉鼠的和他的基&#xff08;mei&#xff09;友&#xff08;zi&#xff09;sugar 住在地下洞穴中&#xff0c;每個節點的編號為 1~n。地下洞穴是一個樹形結構。這一天小倉鼠打算從從他的臥室&#xff08;a&#xff09;到餐廳&#xff08;b&#xff09;&#xff0c;而…

錘子助手插件功能六:啟用攔截消息撤回

錘子助手插件功能六&#xff1a;啟用攔截消息撤回錘子助手插件功能六&#xff1a;啟用攔截消息撤回&#x1f6e1;? 插件簡介 攔截撤回消息&#xff0c;信息不再消失&#x1f527; 功能說明?? 使用風險與注意事項&#x1f3af; 適合人群?? 結語錘子助手插件功能六&#xf…

深度解析:基于EasyX的C++黑白棋AI實現 | 算法核心+圖形化實戰

摘要 本文詳解C黑白棋AI實現&#xff0c;使用EasyX圖形庫打造完整人機對戰系統。涵蓋&#xff1a; 遞歸搜索算法&#xff08;動態規劃優化&#xff09; 棋盤狀態評估函數設計 圖形界面與音效集成 勝負判定與用戶交互 附完整可運行代碼資源文件&#xff0c;提供AI難度調節方案…

樹同構(Tree Isomorphism)

樹同構&#xff08;Tree Isomorphism&#xff09;?? 是圖論中的一個經典問題&#xff0c;主要研究兩棵樹在結構上是否“相同”或“等價”&#xff0c;即是否存在一種節點的一一對應關系&#xff0c;使得兩棵樹的結構完全一致&#xff08;不考慮節點的具體標簽或位置&#xff…

分享如何在保證畫質的前提下縮小視頻體積實用方案

大文件在通過互聯網分享或上傳時會遇到很多限制&#xff0c;比如電子郵件附件大小限制、社交媒體平臺的文件大小要求等。壓縮后的視頻文件更小&#xff0c;更容易上傳到網絡、發送給他人或共享在社交平臺上。它是一款無需安裝的視頻壓縮工具&#xff0c;解壓后直接運行&#xf…

SpringBoot 統一功能處理(攔截器、@ControllerAdvice、Spring AOP)

文章目錄攔截器快速入門攔截器詳解攔截路徑攔截器執行流程全局控制器增強機制(ControllerAdvice)統一數據返回格式&#xff08;ControllerAdvice ResponseBodyAdvice&#xff09;??全局異常處理機制??&#xff08;ControllerAdvice ExceptionHandler&#xff09;全局數據…

建筑墻壁損傷缺陷分割數據集labelme格式7820張20類別

數據集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;僅僅包含jpg圖片和對應的json文件)圖片數量(jpg文件個數)&#xff1a;7820標注數量(json文件個數)&#xff1a;7820標注類別數&#xff1a;20標注類別名稱:["Graffiti","Bearing","Wets…

圖書管理軟件iOS(iPhone)

圖書管理軟件iOS(iPhone)開發進度表2025/07/19圖書管理軟件開發開始一&#xff1a;圖書管理軟件開發iOS&#xff08;iPhone&#xff09;