Spring Security 教程:從入門到精通(含 OAuth2 接入)

Spring Security 教程:從入門到精通(含 OAuth2 接入)

Spring Security 是 Spring 框架中備受推崇的安全模塊,廣泛應用于構建安全可靠的企業級應用程序。它提供了一套全面的解決方案,涵蓋身份認證(Authentication)、授權(Authorization)以及防范各種網絡安全威脅(如 CSRF、會話固定攻擊等)。本文將帶你深入探索 Spring Security,從基礎概念到高級特性,最終實現 OAuth2 接入,助力你打造高度安全的 Web 應用。

一、環境準備

在開始學習之前,確保你的開發環境已經準備好以下工具:

? Java JDK:版本建議使用 JDK 8 或更高版本。可以通過命令 java -version 來檢查已安裝的 Java 版本。
? 構建工具:本文以 Maven 為例,但同樣適用于 Gradle。你可以從 Maven 官方網站 下載并安裝 Maven,安裝完成后,使用命令 mvn -v 驗證。
? 集成開發環境(IDE):如 IntelliJ IDEA 或 Eclipse,能夠提高開發效率。

二、Spring Security 基礎概念

在深入了解 Spring Security 的配置和用法之前,先理解一些關鍵概念:

? 認證(Authentication):驗證用戶身份的過程,確認用戶是否為用戶聲稱的身份。
? 授權(Authorization):在用戶身份經過驗證后,確定用戶具有執行特定操作或訪問特定資源的權限。
? 安全過濾器鏈(Security Filter Chain):Spring Security 的核心組件,負責處理認證和授權邏輯,包含多個安全過濾器,按照特定順序對請求進行處理。
? 上下文(SecurityContext):存儲當前認證用戶的信息,可用于在整個請求周期內訪問用戶相關數據。

三、創建 Spring Boot 項目并引入依賴

  1. 創建 Spring Boot 項目

    使用 Spring Initializr 可以輕松創建一個新的 Spring Boot 項目。在網頁上選擇以下配置:

    ? Project:選擇 Maven Project 或 Gradle Project。
    ? Language:選擇 Java。
    ? Spring Boot:選擇最新穩定版本。
    ? Project Metadata:填寫 GroupArtifact 等信息。
    ? Packaging:選擇 Jar。
    ? Java:選擇合適的 Java 版本(推薦 8 或更高)。

    1. 添加依賴

    在依賴項中選擇 Spring WebSpring Security,點擊 “Generate” 下載項目壓縮包,解壓后導入 IDE 開始開發。

四、Spring Security 入門:自動配置與默認設置

添加 Spring Security 依賴后,Spring Boot 會自動配置一個基本的安全機制。啟動應用程序,訪問任意路徑,Spring Security 都會重定向到你默認的登錄頁面。默認的用戶名是 user,密碼在應用啟動時會輸出到控制臺。

默認安全配置解析

默認情況下,Spring Security 使用內存身份驗證(In-Memory Authentication),并配置了基本的認證規則。這意味著應用啟動時,Spring Security 會自動創建一個內置的用戶存儲,包含一個用戶名為 user,密碼為一個隨機生成的字符串(輸出在控制臺)的用戶。

五、自定義內存用戶認證

為了更好地示范,我們可以自定義內存中的用戶認證信息。創建一個配置類繼承自 WebSecurityConfigurerAdapter,重寫 configure 方法來配置用戶信息。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("admin").password(passwordEncoder().encode("admin123")).roles("ADMIN").and().withUser("user").password(passwordEncoder().encode("user123")).roles("USER");}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/user/**").hasAnyRole("USER", "ADMIN").anyRequest().authenticated().and().formLogin();}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}

詳細解釋

  1. @EnableWebSecurity:開啟 Spring Security 的安全功能。
  2. configure(AuthenticationManagerBuilder auth):配置用戶認證信息。
    ? 使用 inMemoryAuthentication() 啟用內存中用戶存儲。
    ? withUser() 方法定義用戶,指定用戶名、密碼(需要先通過密碼編碼器編碼)和角色。
  3. configure(HttpSecurity http):配置 HTTP 請求的安全規則。
    ? authorizeRequests() 開始請求授權配置。
    ? antMatchers("/admin/**").hasRole("ADMIN") 表示以 /admin/ 開頭的路徑需要 ADMIN 角色權限。
    ? antMatchers("/user/**").hasAnyRole("USER", "ADMIN") 表示以 /user/ 開頭的路徑需要 USERADMIN 角色權限。
    ? anyRequest().authenticated() 表示其他所有請求都需要認證。
    ? formLogin() 啟用表單登錄方式。
  4. 密碼編碼器:使用 BCryptPasswordEncoder 對密碼進行加密存儲,提高安全性。

六、基于數據庫的用戶認證

在實際應用中,用戶信息通常存儲在數據庫中。以下將以 MySQL 數據庫為例,演示如何實現基于數據庫的用戶認證。

1. 數據庫設計

創建用戶表(user)和角色表(role)以及關聯表(user_role):

CREATE TABLE user (id BIGINT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,password VARCHAR(100) NOT NULL
);CREATE TABLE role (id BIGINT AUTO_INCREMENT PRIMARY KEY,role_name VARCHAR(50) NOT NULL UNIQUE
);CREATE TABLE user_role (user_id BIGINT NOT NULL,role_id BIGINT NOT NULL,PRIMARY KEY (user_id, role_id),FOREIGN KEY (user_id) REFERENCES user(id),FOREIGN KEY (role_id) REFERENCES role(id)
);

2. 實體類定義

創建 JPA 實體類,表示用戶和角色:

import javax.persistence.*;
import java.util.Set;@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username;private String password;@ManyToMany(fetch = FetchType.EAGER)@JoinTable(name = "user_role",joinColumns = @JoinColumn(name = "user_id"),inverseJoinColumns = @JoinColumn(name = "role_id"))private Set<Role> roles;// getters and setters
}@Entity
public class Role {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String roleName;// getters and setters
}

3. 數據訪問層(Repository)

創建 UserRepositoryRoleRepository

import org.springframework.data.jpa.repository.JpaRepository;public interface UserRepository extends JpaRepository<User, Long> {User findByUsername(String username);
}public interface RoleRepository extends JpaRepository<Role, Long> {
}

4. 實現 UserDetailsService

UserDetailsService 是 Spring Security 用于加載用戶信息的核心接口。我們創建一個自定義的實現類:

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;import java.util.HashSet;
import java.util.Set;@Service
public class CustomUserDetailsService implements UserDetailsService {private final UserRepository userRepository;public CustomUserDetailsService(UserRepository userRepository) {this.userRepository = userRepository;}@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {User user = userRepository.findByUsername(username);if (user == null) {throw new UsernameNotFoundException("User not found");}Set<GrantedAuthority> authorities = new HashSet<>();for (Role role : user.getRoles()) {authorities.add(new SimpleGrantedAuthority("ROLE_" + role.getRoleName()));}return new org.springframework.security.core.userdetails.User(user.getUsername(),user.getPassword(),authorities);}
}

5. 更新安全配置

SecurityConfig 類中注入 CustomUserDetailsService 并更新認證配置:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(customUserDetailsService).passwordEncoder(passwordEncoder());
}

確保 customUserDetailsService 已經被正確注入到 SecurityConfig 類中。

七、授權管理

Spring Security 提供了靈活的授權機制,允許你基于角色、權限或其他條件來控制資源的訪問。

1. 使用注解進行方法級授權

你可以在控制器的方法上使用 @PreAuthorize@PostAuthorize 等注解來定義細粒度的訪問控制規則。

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class AdminController {@GetMapping("/admin/dashboard")@PreAuthorize("hasRole('ADMIN')")public String adminDashboard() {return "歡迎來到管理員儀表盤";}
}

2. 在安全配置中定義 URL 級授權

SecurityConfig 類的 configure(HttpSecurity http) 方法中,你可以使用表達式語言(SpEL)來定義基于 URL 的訪問規則。

@Override
protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/user/**").hasAnyRole("USER", "ADMIN").anyRequest().authenticated().and().formLogin().loginPage("/login") // 自定義登錄頁面.permitAll().and().logout().permitAll();
}

3. 自定義權限評估器

對于更復雜的授權需求,你可以實現自定義的 PermissionEvaluator 并將其集成到 Spring Security 中。

八、CSRF 防護

跨站請求偽造(CSRF)是一種常見的網絡攻擊方式。Spring Security 默認啟用了 CSRF 防護機制,它會為每個表單提交生成一個 CSRF 令牌,并在服務器端進行驗證。

1. 禁用 CSRF 防護

在某些情況下,如構建 RESTful API 時,你可能需要禁用 CSRF 防護。可以在安全配置中這樣做:

@Override
protected void configure(HttpSecurity http) throws Exception {http.csrf().disable()// 其他配置
}

注意:禁用 CSRF 防護會使應用面臨風險,建議僅在必要時禁用,并確保其他防護措施到位。

2. 自定義 CSRF 令牌存儲

你可以自定義 CSRF 令牌的存儲方式,例如將其存儲在 HTTP 頭中而不是默認的 Cookie 中,以適應特定的應用需求。

九、OAuth2 接入

OAuth2 是一種開放標準,用于授權第三方應用訪問用戶資源,而無需獲取用戶的憑證。Spring Security 提供了對 OAuth2 的全面支持,使得集成變得簡便。

1. 添加依賴

為了支持 OAuth2 客戶端或資源服務器功能,需要在 pom.xml 中添加相應的依賴。

作為 OAuth2 客戶端:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>

作為 OAuth2 資源服務器:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>

2. 配置 OAuth2 客戶端

假設我們要將應用配置為 OAuth2 客戶端,以使用 Google 進行登錄。

application.properties 中添加配置:

spring.security.oauth2.client.registration.google.client-id=YOUR_GOOGLE_CLIENT_ID
spring.security.oauth2.client.registration.google.client-secret=YOUR_GOOGLE_CLIENT_SECRET
spring.security.oauth2.client.registration.google.redirect-uri={baseUrl}/login/oauth2/code/{registrationId}
spring.security.oauth2.client.provider.google.authorization-uri=https://accounts.google.com/o/oauth2/v2/auth
spring.security.oauth2.client.provider.google.token-uri=https://oauth2.googleapis.com/token
spring.security.oauth2.client.provider.google.user-info-uri=https://www.googleapis.com/oauth2/v3/userinfo
spring.security.oauth2.client.provider.google.user-name-attribute=sub

更新安全配置類以啟用 OAuth2 登錄:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;@Configuration
@EnableWebSecurity
public class OAuth2SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeRequests(authorizeRequests ->authorizeRequests.antMatchers("/", "/login**").permitAll().anyRequest().authenticated()).oauth2Login(oauth2Login ->oauth2Login.loginPage("/login"));return http.build();}
}

3. 配置 OAuth2 資源服務器

如果你的應用是一個 OAuth2 資源服務器,需要驗證傳入請求的訪問令牌。

application.properties 中添加配置:

spring.security.oauth2.resourceserver.jwt.issuer-uri=https://accounts.google.com

更新安全配置類以啟用資源服務器:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;@Configuration
@EnableWebSecurity
public class ResourceServerConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeRequests(authorizeRequests ->authorizeRequests.antMatchers("/", "/public/**").permitAll().anyRequest().authenticated()).oauth2ResourceServer(oauth2ResourceServer ->oauth2ResourceServer.jwt());return http.build();}
}

4. 自定義 OAuth2 登錄流程

你可以自定義 OAuth2 登錄后的處理邏輯,例如獲取額外的用戶信息、映射用戶角色等。

創建自定義的 OAuth2UserService

import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;
import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Service;@Service
public class CustomOAuth2UserService extends DefaultOAuth2UserService {@Overridepublic OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {OAuth2User user = super.loadUser(userRequest);// 在這里可以添加自定義邏輯,如映射角色、獲取額外信息等return user;}
}

在安全配置中注入自定義的 OAuth2UserService

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http, CustomOAuth2UserService customOAuth2UserService) throws Exception {http.authorizeRequests(authorizeRequests ->authorizeRequests.antMatchers("/", "/login**").permitAll().anyRequest().authenticated()).oauth2Login(oauth2Login ->oauth2Login.userInfoEndpoint(userInfoEndpoint ->userInfoEndpoint.userService(customOAuth2UserService)));return http.build();
}

十、高級特性與優化

1. 使用 JWT(JSON Web Token)

JWT 是一種緊湊且自包含的令牌格式,常用于無狀態的認證機制。Spring Security 支持 JWT 的生成與驗證,適用于構建微服務架構中的認證與授權。

2. 多因素認證(MFA)

為了提高安全性,可以集成多因素認證,如短信驗證碼、TOTP(基于時間的一次性密碼)等。Spring Security 可以與第三方庫或服務集成實現 MFA。

3. 細粒度權限控制

通過自定義權限評估器、訪問決策管理器等組件,可以實現更細粒度的權限控制,滿足復雜業務場景下的安全需求。

4. 安全審計與日志

記錄用戶的認證與授權活動,有助于監控潛在的安全威脅和進行事后審計。可以集成日志框架(如 Logback、Log4j2)與安全事件監聽器來實現。

十一、總結

Spring Security 提供了一個強大而靈活的安全框架,涵蓋了從基礎認證到高級授權的各個方面。通過本文的學習,你應該已經掌握了:

  1. Spring Security 的基本概念和入門配置。
  2. 如何實現基于內存和數據庫的用戶認證。
  3. 授權管理的多種方式,包括方法級和 URL 級授權。
  4. CSRF 防護機制及其配置。
  5. 如何集成 OAuth2 實現第三方登錄和資源保護。
  6. 一些高級特性和優化方法,提升應用的安全性。

Spring Security 功能豐富,適用于各種復雜的應用場景。建議在實際項目中,根據具體需求深入學習和實踐相關內容,并參考 Spring Security 官方文檔 獲取最新的信息和最佳實踐。

希望這個全面的教程能夠幫助你從入門到精通掌握 Spring Security,并成功應用于你的項目中,構建安全可靠的 Web 應用。

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

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

相關文章

OpenGL ES 入門指南:從基礎到實戰

引言&#xff1a;為什么需要 OpenGL ES&#xff1f; 在當今的嵌入式設備&#xff08;如智能手機、汽車儀表盤、智能家居中控屏&#xff09;中&#xff0c;流暢的圖形渲染能力是用戶體驗的核心。OpenGL ES&#xff08;OpenGL for Embedded Systems&#xff09; 作為行業標準&am…

java的WeakHashMap可以用來做緩存使用?強軟弱虛四種引用對比

在 Java 中&#xff0c;引用&#xff08;Reference&#xff09;機制用于管理對象的生命周期和垃圾回收。Java 提供了四種類型的引用&#xff1a;強引用&#xff08;Strong Reference&#xff09;、軟引用&#xff08;Soft Reference&#xff09;、弱引用&#xff08;Weak Refer…

51單片機指令系統入門

目錄 基本概念講解 一、機器指令? 二、匯編指令? &#xff08;一&#xff09;匯編指令的一般格式 &#xff08;二&#xff09;按字節數分類的指令 三、高級指令 總結? 基本概念講解 指令是計算機&#xff08;或單片機&#xff09;中 CPU 能夠識別并執行的基本操作命令…

使用 Docker 部署 MySQL 8

使用 Docker 部署 MySQL 8 詳細指南 MySQL 是一個廣泛使用的開源關系型數據庫管理系統。通過 Docker 部署 MySQL 8 可以快速搭建一個可移植、可擴展的數據庫環境。本文將詳細介紹如何使用 Docker 部署 MySQL 8&#xff0c;并講解如何根據需求配置 MySQL。 從拉取鏡像開始的詳細…

AtCoder Beginner Contest 397(ABCDE)

目錄 A - Thermometer 翻譯&#xff1a; 思路&#xff1a; 實現&#xff1a; B - Ticket Gate Log 翻譯&#xff1a; 思路&#xff1a; 實現&#xff1a; C - Variety Split Easy 翻譯&#xff1a; 思路&#xff1a; 實現&#xff1a; D - Cubes 翻譯&#xff1a…

數模AI使用教程(新) 2025.3.17

DeepseekR1doubao1.5大模型組合&#xff0c;數模智能體題目解答一等水平&#xff0c;另外也有統計建模、期刊復現智能體。 功能&#xff1a;問題重述、解釋數據文件、深度思考與邏輯梳理、問題關鍵點分析、知識整理、查找數據源、問題分析、使用方法推薦[會詢問要求]、模型建立…

Spring Cloud Gateway 生產級實踐:高可用 API 網關架構與流量治理解析

API 網關的核心價值 在分布式微服務架構中&#xff0c;API 網關作為系統流量的唯一入口&#xff0c;承擔著路由分發、安全防護、流量治理三大核心職責。Spring Cloud Gateway 基于響應式編程模型與 Netty 高性能網絡框架&#xff0c;提供靈活的路由規則、動態過濾器鏈和深度集…

在Pycharm配置conda虛擬環境的Python解釋器

〇、前言 今天在配置python解釋器時遇到了這樣的問題 經過一下午自行摸索、上網搜尋后&#xff0c;終于找到的解決的方案&#xff0c;遂將該方法簡要的記錄下來&#xff0c;以備后用&#xff0c;并希望能幫助到有同樣問題或需求的朋友:) 我所使用的軟件的版本如下&#xff0c;假…

寬帶(Broadband)

寬帶&#xff08;Broadband&#xff09; 是一種高速互聯網接入技術&#xff0c;能夠同時傳輸多種類型的數據&#xff08;如語音、視頻、文本等&#xff09;。與傳統的窄帶&#xff08;如撥號上網&#xff09;相比&#xff0c;寬帶提供了更高的數據傳輸速率和更穩定的連接&#…

集成學習(上):Bagging集成方法

一、什么是集成學習&#xff1f; 在機器學習的世界里&#xff0c;沒有哪個模型是完美無缺的。就像古希臘神話中的"盲人摸象"&#xff0c;單個模型往往只能捕捉到數據特征的某個側面。但當我們把多個模型的智慧集合起來&#xff0c;就能像拼圖一樣還原出完整的真相&a…

VLLM:虛擬大型語言模型(Virtual Large Language Model)

VLLM&#xff1a;虛擬大型語言模型&#xff08;Virtual Large Language Model&#xff09; VLLM指的是一種基于云計算的大型語言模型的虛擬實現。它通常是指那些由多個服務器組成的分布式計算環境中的復雜機器學習模型&#xff0c;這些模型能夠處理和理解大量的文本數據。VLLM的…

Springboot+Vue登錄、注冊功能(含驗證碼)(后端!)

我們首先寫一個接口&#xff0c;叫login&#xff01;然后對傳入一個user&#xff0c;因為我們前端肯定是要傳過來一個user&#xff0c;然后我們后端返回一個user&#xff0c;因為我們要根據這個去校驗&#xff01;我們還引入了一個hutool的一個東西&#xff0c;在pom文件里面引…

馮 ? 諾依曼體系結構

馮 ? 諾依曼體系結構 一、馮 ? 諾依曼體系結構推導階段 1&#xff1a;初始計算機體系結構&#xff08;僅輸入、運算、輸出&#xff09;階段 2&#xff1a;加入控制功能&#xff0c;初步形成 CPU 概念階段 3&#xff1a;性能瓶頸與引入內存階段 4&#xff1a;最終馮諾依曼體系…

Python print() 打印多個變量時,可變對象和不可變對象的區別

先來看這段代碼&#xff1a; tmp [] print(tmp, tmp.append(1), tmp)輸出&#xff1a; [1] None [1]并不是一些人認為的 [] None [1] 這是因為列表是可變對象&#xff0c;print()打印前會先計算出所有結果&#xff0c;最后再打印出來&#xff0c;中間在列表中添加了1&#…

【數學 線性代數】差分約束

前言 C算法與數據結構 本博文代碼打包下載 什么是差分約束 x系列是變量&#xff0c;y系列是常量&#xff0c;差分系統由若干如下不等式組成。 x1-x2 < y1 x2-x3 < y2 ? \cdots ? 可能有負環的最短路 個人習慣&#xff1a;如果存在a指向b的邊&#xff0c;則a是b的…

AutoGen :使用 Swarm 構建自治型多智能體團隊

??????本人承接各類AI相關應用開發項目(包括但不限于大模型微調、RAG、AI智能體、NLP、機器學習算法、運籌優化算法、數據分析EDA等) !!!?????? 有意愿請私信!!!AutoGen 的 AgentChat 模塊提供了一種強大的方法來構建多智能體協作系統。 在之前的文章中,我們探討了…

2025人工智能“落地生花”:這六大領域正掀起顛覆性革命

——從醫療到養老&#xff0c;一場“AI”的全民狂歡正在上演 2025年的春天&#xff0c;全球科技界的熱搜被一個中國AI大模型“霸榜”——DeepSeek。從春晚的機器人熱舞到政務系統的“數字員工上崗”&#xff0c;從醫療診斷到工業煉鋼&#xff0c;這場始于春節的技術海嘯&#…

第27周JavaSpringboot git初識

Git 課程筆記 一、Git 的介紹 1. Git 的誕生背景 Git 是 Linux 內核的作者 Linus Torvalds 為了更好地管理 Linux 內核開發而創建的版本控制系統。在 Linux 內核開發初期&#xff0c;由于開發者眾多&#xff0c;協作成本很高&#xff0c;后來使用了 BitKeeper 工具來輔助協作…

藍耘智算|從靜態到動態:探索Maas平臺海螺AI圖片生成視頻功能的強大能力

文章目錄 &#x1f44f;一、技術介紹&#x1f44f;二、平臺注冊&#x1f44f;三、功能體驗&#x1f44f;四、總結 隨著人工智能技術的快速發展&#xff0c;視頻處理和生成技術已經成為了眾多行業關注的熱點。最近&#xff0c;我有機會體驗了藍耘智算平臺的Maas平海螺AI視頻產品…

解決從deepseek接口獲取的流式響應輸出到前端都是undefined的問題

你的前端 EventSource 代碼遇到了 undefined 連續輸出 的問題&#xff0c;通常是因為&#xff1a; AI 返回的內容被拆成了單個字符&#xff0c;導致前端 JSON.parse(event.data).content 獲取到的是單個字符&#xff0c;而 undefined 可能是因為某些數據塊沒有 content 字段。…