最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Security中靜態(tài)資源免認(rèn)證訪問的配置方法

 更新時(shí)間:2026年06月14日 15:26:07   作者:知遠(yuǎn)漫談  
在實(shí)際項(xiàng)目中,我們常常會(huì)遇到一個(gè)看似簡單卻容易出錯(cuò)的問題:如何讓靜態(tài)資源(如 CSS、JavaScript、圖片、字體等)繞過安全認(rèn)證,實(shí)現(xiàn)公開訪問?本文將深入探討 Spring Security 中靜態(tài)資源免認(rèn)證訪問的配置方法,需要的朋友可以參考下

引言

在現(xiàn)代 Web 應(yīng)用開發(fā)中,Spring Security 作為 Java 生態(tài)中最主流的安全框架,為應(yīng)用程序提供了強(qiáng)大的身份驗(yàn)證和授權(quán)機(jī)制。然而,在實(shí)際項(xiàng)目中,我們常常會(huì)遇到一個(gè)看似簡單卻容易出錯(cuò)的問題:如何讓靜態(tài)資源(如 CSS、JavaScript、圖片、字體等)繞過安全認(rèn)證,實(shí)現(xiàn)公開訪問?

如果不正確處理這個(gè)問題,用戶可能會(huì)看到頁面布局錯(cuò)亂、樣式丟失、腳本無法加載等現(xiàn)象,嚴(yán)重影響用戶體驗(yàn)。更嚴(yán)重的是,某些關(guān)鍵的前端資源(如登錄頁的 JS 文件)若被攔截,甚至?xí)?dǎo)致整個(gè)登錄流程無法進(jìn)行。

本文將深入探討 Spring Security 中靜態(tài)資源免認(rèn)證訪問的配置方法,從基礎(chǔ)原理到高級(jí)技巧,從常見誤區(qū)到最佳實(shí)踐,幫助你全面掌握這一重要知識(shí)點(diǎn)。無論你是初學(xué)者還是有一定經(jīng)驗(yàn)的開發(fā)者,都能從中獲得實(shí)用的解決方案和深入的理解。

為什么需要靜態(tài)資源免認(rèn)證?

在理解“怎么做”之前,我們先要明白“為什么”。

默認(rèn)情況下,Spring Security 會(huì)對(duì)所有請(qǐng)求路徑進(jìn)行安全攔截。這意味著,即使是一個(gè)簡單的 /css/style.css 請(qǐng)求,也會(huì)被要求進(jìn)行身份驗(yàn)證。對(duì)于登錄頁面、錯(cuò)誤頁面、公共資源等場景,這顯然是不合理的。

典型問題場景

  1. 登錄頁面樣式丟失:用戶訪問 /login 頁面時(shí),瀏覽器嘗試加載 /css/login.css,但該請(qǐng)求被 Spring Security 攔截并重定向到登錄頁,導(dǎo)致無限循環(huán)或樣式失效。
  2. 公共 API 文檔無法訪問:Swagger UI 或 OpenAPI 文檔通常包含大量靜態(tài)資源(JS、CSS、YAML),若未放行,文檔頁面將無法正常渲染。
  3. 前端構(gòu)建產(chǎn)物被攔截:使用 Vue、React 等現(xiàn)代前端框架構(gòu)建的單頁應(yīng)用(SPA),其 dist 目錄下的所有資源都需要公開訪問。
  4. 驗(yàn)證碼圖片無法顯示:雖然驗(yàn)證碼接口本身可能需要認(rèn)證邏輯,但生成的圖片資源路徑必須可公開訪問。

小知識(shí):Spring Boot 默認(rèn)會(huì)將 /static、/public、/resources/META-INF/resources 下的靜態(tài)資源映射到根路徑(/**)。例如,src/main/resources/static/css/app.css 可通過 http://localhost:8080/css/app.css 訪問。

Spring Security 的請(qǐng)求處理流程

要正確配置靜態(tài)資源放行,首先需要理解 Spring Security 是如何處理一個(gè) HTTP 請(qǐng)求的。

從上圖可以看出,Spring Security 提供了兩種主要方式來“繞過”安全檢查:

  1. WebSecurity.ignore():完全忽略某些路徑,這些請(qǐng)求不會(huì)進(jìn)入 Spring Security 的過濾器鏈。
  2. HttpSecurity.authorizeHttpRequests().permitAll():請(qǐng)求仍會(huì)經(jīng)過 Security 過濾器,但被明確授權(quán)為“無需認(rèn)證即可訪問”。

這兩種方式在性能和安全性上有細(xì)微差別,我們將在后文詳細(xì)討論。

方法一:使用WebSecurity的ignoring()方法

這是最徹底、性能最好的方式。被忽略的路徑完全不會(huì)經(jīng)過 Spring Security 的任何過濾器,包括 CSRF、Session 管理等。

基本配置示例

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authz -> authz
                .requestMatchers("/admin/**").hasRole("ADMIN")
                .anyRequest().authenticated()
            )
            .formLogin(form -> form
                .loginPage("/login")
                .permitAll()
            );
        return http.build();
    }

    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring()
            .requestMatchers("/css/**", "/js/**", "/images/**", "/webjars/**");
    }
}

在這個(gè)配置中:

  • 所有以 /css/、/js/、/images/ 開頭的請(qǐng)求,以及 WebJars 資源,都會(huì)被 WebSecurity 忽略。
  • 這些請(qǐng)求直接由 Spring MVC 的 ResourceHttpRequestHandler 處理,性能更高。
  • 注意:/login 頁面本身雖然需要放行,但它是一個(gè)控制器路徑,不是靜態(tài)資源,因此應(yīng)在 HttpSecurity 中配置 permitAll(),而不是在 ignoring() 中。

使用 Ant 風(fēng)格路徑匹配

Spring Security 支持 Ant 風(fēng)格的路徑模式,非常靈活:

  • /**:匹配任意層級(jí)的路徑
  • /*.css:匹配根路徑下的所有 CSS 文件
  • /static/**:匹配 /static/ 下的所有內(nèi)容
  • /api/v1/public/**:匹配特定 API 路徑
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
    return (web) -> web.ignoring()
        .requestMatchers(
            PathRequest.toStaticResources().atCommonLocations(), // 內(nèi)置靜態(tài)資源位置
            "/favicon.ico",
            "/robots.txt",
            "/manifest.json"
        );
}

提示PathRequest.toStaticResources().atCommonLocations() 是 Spring Boot 提供的便捷方法,它會(huì)自動(dòng)包含常見的靜態(tài)資源路徑,如 /webjars/**/css/**、/js/** 等。

何時(shí)使用ignoring()?

  • 純靜態(tài)資源:CSS、JS、圖片、字體等。
  • 性能敏感場景:高并發(fā)的公共資源訪問。
  • 不需要任何安全上下文:這些資源不依賴于用戶身份或會(huì)話信息。

方法二:使用HttpSecurity的permitAll()

ignoring() 不同,permitAll() 會(huì)讓請(qǐng)求仍然經(jīng)過 Spring Security 的完整過濾器鏈,只是在授權(quán)階段被放行。

基本配置示例

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authz -> authz
                .requestMatchers("/css/**", "/js/**", "/images/**").permitAll()
                .requestMatchers("/login", "/register", "/error").permitAll()
                .requestMatchers("/admin/**").hasRole("ADMIN")
                .anyRequest().authenticated()
            )
            .formLogin(form -> form
                .loginPage("/login")
                .permitAll()
            );
        return http.build();
    }
}

注意這里我們將靜態(tài)資源路徑放在了 authorizeHttpRequests() 中,并調(diào)用 permitAll()。

permitAll()的特點(diǎn)

  1. 仍經(jīng)過安全過濾器:包括 CSRF 保護(hù)、Session 創(chuàng)建、SecurityContext 設(shè)置等。
  2. 可以訪問 Security Context:在 Controller 或 Thymeleaf 模板中,仍然可以獲取當(dāng)前認(rèn)證信息(雖然可能是匿名的)。
  3. 適用于需要部分安全功能的場景:例如,某些靜態(tài)資源可能需要記錄訪問日志(通過自定義過濾器),或者需要 CSRF Token(雖然罕見)。

實(shí)際應(yīng)用場景

假設(shè)你有一個(gè)前端應(yīng)用,其入口 HTML 文件(如 index.html)需要根據(jù)用戶是否登錄顯示不同內(nèi)容。這時(shí),雖然 index.html 是靜態(tài)資源,但你可能希望它能感知到安全上下文:

<!-- index.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>My App</title>
    <link rel="stylesheet" th:href="@{/css/app.css}" rel="external nofollow" >
</head>
<body>
    <div sec:authorize="isAnonymous()">
        <a href="/login" rel="external nofollow" >請(qǐng)登錄</a>
    </div>
    <div sec:authorize="isAuthenticated()">
        <span>Hello, <span sec:authentication="name"></span>!</span>
        <a href="/logout" rel="external nofollow" >退出</a>
    </div>
    <script th:src="@{/js/app.js}"></script>
</body>
</html>

在這種情況下,index.html 不能被 ignoring(),否則 Thymeleaf 的安全方言(sec:authorize)將無法工作。你需要將其放在 permitAll() 中:

.requestMatchers("/", "/index.html", "/css/**", "/js/**").permitAll()

ignoring()vspermitAll():關(guān)鍵區(qū)別 ??

特性WebSecurity.ignoring()HttpSecurity.permitAll()
是否經(jīng)過 Security 過濾器鏈? 完全跳過? 完整經(jīng)過
性能? 更高(無安全開銷)?? 略低(有安全開銷)
能否訪問 SecurityContext? 不能? 能(可能是匿名認(rèn)證)
CSRF 保護(hù)? 無? 有(但通常不需要)
Session 創(chuàng)建? 不創(chuàng)建? 可能創(chuàng)建(取決于配置)
適用資源類型純靜態(tài)資源(CSS/JS/圖片)需要安全上下文的頁面

最佳實(shí)踐建議

  • 對(duì)于 純靜態(tài)資源(CSS、JS、圖片、字體等),優(yōu)先使用 ignoring()
  • 對(duì)于 HTML 頁面(尤其是需要?jiǎng)討B(tài)內(nèi)容的),使用 permitAll()。
  • 登錄頁、注冊頁、錯(cuò)誤頁等控制器路徑,必須使用 permitAll()。

常見誤區(qū)與陷阱

誤區(qū) 1:混淆靜態(tài)資源路徑與控制器路徑

很多開發(fā)者會(huì)錯(cuò)誤地將控制器路徑(如 /login)添加到 ignoring() 中:

// ? 錯(cuò)誤做法
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
    return (web) -> web.ignoring()
        .requestMatchers("/login", "/css/**"); // /login 是控制器,不是靜態(tài)資源!
}

這樣做的后果是:/login 請(qǐng)求完全繞過了 Spring Security,導(dǎo)致:

  • 無法使用 Thymeleaf 安全標(biāo)簽(如 sec:authorize
  • 無法自動(dòng)處理登錄失敗重定向
  • 可能引發(fā) CSRF 漏洞(如果表單提交未保護(hù))

? 正確做法:控制器路徑應(yīng)在 HttpSecurity 中配置 permitAll()。

誤區(qū) 2:路徑匹配順序錯(cuò)誤

Spring Security 的匹配規(guī)則是按順序匹配,一旦匹配成功就不再繼續(xù)。因此,更具體的規(guī)則應(yīng)放在前面:

// ? 正確順序
.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers("/user/**").hasRole("USER")
.requestMatchers("/css/**", "/js/**").permitAll()
.anyRequest().authenticated()

// ? 錯(cuò)誤順序:/admin/** 永遠(yuǎn)不會(huì)被匹配到
.requestMatchers("/css/**", "/js/**").permitAll()
.requestMatchers("/admin/**").hasRole("ADMIN") // 這行永遠(yuǎn)不會(huì)執(zhí)行!
.anyRequest().authenticated()

誤區(qū) 3:忽略 WebJars 資源

如果你使用了 WebJars(將前端庫打包為 JAR 依賴),需要特別放行 /webjars/** 路徑:

@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
    return (web) -> web.ignoring()
        .requestMatchers("/webjars/**"); // 放行 WebJars
}

否則,像 Bootstrap、jQuery 等庫將無法加載。

誤區(qū) 4:生產(chǎn)環(huán)境與開發(fā)環(huán)境配置混用

在開發(fā)環(huán)境中,你可能使用內(nèi)嵌的 H2 控制臺(tái)或 Actuator 端點(diǎn),需要額外放行:

// 僅在開發(fā)環(huán)境啟用
@Profile("dev")
@Bean
public WebSecurityCustomizer devWebSecurityCustomizer() {
    return (web) -> web.ignoring()
        .requestMatchers("/h2-console/**", "/actuator/**");
}

但在生產(chǎn)環(huán)境中,這些路徑應(yīng)嚴(yán)格保護(hù)或禁用,避免安全風(fēng)險(xiǎn)。

高級(jí)配置技巧

動(dòng)態(tài)配置靜態(tài)資源路徑

有時(shí),靜態(tài)資源路徑可能來自配置文件(如 application.yml),你可以通過 @Value 注入:

# application.yml
app:
  static-paths:
    - /custom-assets/**
    - /uploads/**
@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Value("${app.static-paths}")
    private String[] staticPaths;

    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring()
            .requestMatchers(staticPaths);
    }
}

結(jié)合 ResourceHandlerRegistry

如果你自定義了靜態(tài)資源位置(通過 WebMvcConfigurer),確保 Security 配置與之匹配:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/uploads/**")
                .addResourceLocations("file:/opt/myapp/uploads/");
    }
}

// SecurityConfig.java
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
    return (web) -> web.ignoring()
        .requestMatchers("/uploads/**"); // 與 ResourceHandler 一致
}

處理 SPA(單頁應(yīng)用)路由

對(duì)于 Vue、React 等 SPA 應(yīng)用,所有前端路由都應(yīng)返回 index.html。你需要放行所有非 API 路徑:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
        .authorizeHttpRequests(authz -> authz
            .requestMatchers("/api/**").authenticated() // API 需要認(rèn)證
            .requestMatchers("/**").permitAll() // 所有其他路徑(包括前端路由)公開
        )
        .csrf(csrf -> csrf
            .ignoringRequestMatchers("/api/**") // 根據(jù)需要調(diào)整 CSRF
        );
    return http.build();
}

// 同時(shí)配置 WebMvcConfigurer 處理前端路由
@Configuration
public class SpaWebConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/{spring:\\w+}")
                .setViewName("forward:/index.html");
        registry.addViewController("/**/{spring:\\w+}")
                .setViewName("forward:/index.html");
    }
}

完整示例:企業(yè)級(jí)應(yīng)用配置

下面是一個(gè)結(jié)合了多種場景的完整配置示例:

@Configuration
@EnableWebSecurity
public class EnterpriseSecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authz -> authz
                // 公共頁面
                .requestMatchers("/", "/login", "/register", "/forgot-password", "/error").permitAll()
                // Swagger UI (開發(fā)環(huán)境)
                .requestMatchers("/swagger-ui/**", "/v3/api-docs/**").permitAll()
                // 公共 API
                .requestMatchers("/api/public/**").permitAll()
                // 用戶相關(guān) API
                .requestMatchers("/api/user/**").hasRole("USER")
                // 管理員 API
                .requestMatchers("/api/admin/**").hasRole("ADMIN")
                // 其他 API 需要認(rèn)證
                .requestMatchers("/api/**").authenticated()
                // 前端路由(SPA)
                .requestMatchers("/**").permitAll()
            )
            .formLogin(form -> form
                .loginPage("/login")
                .loginProcessingUrl("/login")
                .defaultSuccessUrl("/dashboard", true)
                .failureUrl("/login?error=true")
                .permitAll()
            )
            .logout(logout -> logout
                .logoutUrl("/logout")
                .logoutSuccessUrl("/?logout=true")
                .permitAll()
            )
            .csrf(csrf -> csrf
                .ignoringRequestMatchers("/api/**") // 假設(shè) API 使用 JWT,無需 CSRF
            );

        return http.build();
    }

    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring()
            // 內(nèi)置靜態(tài)資源位置
            .requestMatchers(PathRequest.toStaticResources().atCommonLocations())
            // 自定義靜態(tài)資源
            .requestMatchers("/uploads/**", "/downloads/**")
            // 開發(fā)工具(僅 dev profile)
            .requestMatchers("/h2-console/**");
    }
}

這個(gè)配置覆蓋了:

  • 公共頁面與靜態(tài)資源
  • Swagger 文檔(常用于 API 調(diào)試)
  • 分層的 API 權(quán)限控制
  • SPA 前端路由支持
  • 完整的登錄/登出流程
  • CSRF 保護(hù)的合理豁免

測試你的配置

配置完成后,務(wù)必進(jìn)行充分測試:

  1. 直接訪問靜態(tài)資源 URL:如 http://localhost:8080/css/app.css,應(yīng)能直接下載文件,無重定向。
  2. 訪問登錄頁:確保樣式和腳本正常加載。
  3. 未登錄訪問受保護(hù)頁面:應(yīng)被重定向到登錄頁。
  4. 登錄后訪問資源:確保權(quán)限控制生效。

可以使用 Spring Security 的測試支持編寫單元測試:

@SpringBootTest
@AutoConfigureTestDatabase
@Import(SecurityConfig.class)
class SecurityConfigTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    void staticResourcesShouldBePublic() throws Exception {
        mockMvc.perform(get("/css/app.css"))
               .andExpect(status().isOk())
               .andExpect(content().contentType("text/css"));
    }

    @Test
    void loginPageShouldBePublic() throws Exception {
        mockMvc.perform(get("/login"))
               .andExpect(status().isOk())
               .andExpect(view().name("login"));
    }

    @Test
    void adminPageShouldRequireAuth() throws Exception {
        mockMvc.perform(get("/admin/dashboard"))
               .andExpect(status().is3xxRedirection())
               .andExpect(redirectedUrl("http://localhost/login"));
    }
}

性能考量與優(yōu)化

雖然靜態(tài)資源放行對(duì)性能影響不大,但在高并發(fā)場景下,仍有一些優(yōu)化點(diǎn):

1. 優(yōu)先使用ignoring()

如前所述,ignoring() 完全跳過 Security 過濾器鏈,減少了不必要的對(duì)象創(chuàng)建和方法調(diào)用。

2. 合理使用緩存頭

為靜態(tài)資源添加緩存頭,減少重復(fù)請(qǐng)求:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**")
                .addResourceLocations("classpath:/static/")
                .setCachePeriod(3600) // 1小時(shí)緩存
                .resourceChain(true)
                .addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
    }
}

3. 使用 CDN

對(duì)于大型應(yīng)用,考慮將靜態(tài)資源托管到 CDN,進(jìn)一步減輕服務(wù)器壓力。

安全注意事項(xiàng)

放行靜態(tài)資源雖必要,但也需注意安全:

1. 避免路徑遍歷漏洞

不要放行過于寬泛的路徑,如 /**,除非你明確知道自己在做什么(如 SPA 場景)。

// ? 危險(xiǎn)!可能暴露敏感文件
.requestMatchers("/**").permitAll()

2. 敏感信息不要放在靜態(tài)資源中

即使放行了 /config/,也不要在此目錄下存放包含密碼、密鑰的 JSON 文件。

3. 定期審計(jì)放行路徑

隨著項(xiàng)目演進(jìn),及時(shí)清理不再需要的放行規(guī)則。

與其他技術(shù)的集成

與 Thymeleaf 集成

Thymeleaf 的 Spring Security 方言(thymeleaf-extras-springsecurity)需要 Security Context,因此使用 permitAll() 而非 ignoring()

<!-- Maven dependency -->
<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity6</artifactId>
</dependency>
<!-- 在 permitAll() 的頁面中使用 -->
<div sec:authorize="isAuthenticated()">
    <p>Welcome, <span sec:authentication="name"></span>!</p>
</div>

與 Spring Boot Actuator 集成

Actuator 端點(diǎn)通常需要保護(hù),但健康檢查(/actuator/health)可能需要公開:

.requestMatchers("/actuator/health", "/actuator/info").permitAll()
.requestMatchers("/actuator/**").hasRole("ADMIN")

與 OAuth2 集成

在 OAuth2 應(yīng)用中,靜態(tài)資源放行邏輯相同,但需注意回調(diào)路徑(如 /login/oauth2/code/*)必須放行:

.requestMatchers("/login/oauth2/code/**").permitAll()
.requestMatchers("/css/**", "/js/**").permitAll()

總結(jié)與最佳實(shí)踐

通過本文的深入探討,我們明確了 Spring Security 中靜態(tài)資源免認(rèn)證訪問的核心要點(diǎn):

區(qū)分兩種放行方式

  • WebSecurity.ignoring():用于純靜態(tài)資源,性能最優(yōu)。
  • HttpSecurity.permitAll():用于需要安全上下文的頁面。

遵循最小權(quán)限原則:只放行必要的路徑,避免過度開放。

注意路徑匹配順序:具體規(guī)則在前,通用規(guī)則在后。

測試覆蓋全面:確保靜態(tài)資源、公共頁面、受保護(hù)資源均按預(yù)期工作。

結(jié)合項(xiàng)目實(shí)際:SPA、傳統(tǒng)多頁應(yīng)用、混合架構(gòu)各有不同的配置策略。

渲染錯(cuò)誤: Mermaid 渲染失敗: Parse error on line 2: ...WebSecurity.ignoring()] A -->|HTML頁面 -----------------------^ Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'PS'

最后,記?。?strong>安全與便利需要平衡。合理的靜態(tài)資源放行配置,既能保障系統(tǒng)安全,又能提供流暢的用戶體驗(yàn)。希望本文能幫助你在 Spring Security 的道路上走得更穩(wěn)、更遠(yuǎn)!

以上就是Spring Security中靜態(tài)資源免認(rèn)證訪問的配置方法的詳細(xì)內(nèi)容,更多關(guān)于Spring Security靜態(tài)資源免認(rèn)證訪問的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring如何將配置文件中的簡單值注入Bean中

    Spring如何將配置文件中的簡單值注入Bean中

    Spring 提供了幾種優(yōu)雅的方式來將配置文件中的簡單值(如字符串、數(shù)字、布爾值等)注入到 Bean 中,下面小編就為大家介紹一下兩種主流的方法吧
    2025-07-07
  • 詳解關(guān)于Spring Cloud 框架熱部署的方法

    詳解關(guān)于Spring Cloud 框架熱部署的方法

    本篇文章主要介紹了詳解關(guān)于Spring Cloud 框架熱部署的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • 淺談使用setBounds()方法需要注意的地方

    淺談使用setBounds()方法需要注意的地方

    下面小編就為大家?guī)硪黄獪\談使用setBounds()方法需要注意的地方。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • java8 對(duì)象轉(zhuǎn)Map時(shí)重復(fù) key Duplicate key xxxx的解決

    java8 對(duì)象轉(zhuǎn)Map時(shí)重復(fù) key Duplicate key xxxx的解決

    這篇文章主要介紹了java8 對(duì)象轉(zhuǎn)Map時(shí)重復(fù) key Duplicate key xxxx的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • idea快速拉取新分支實(shí)現(xiàn)方式

    idea快速拉取新分支實(shí)現(xiàn)方式

    該文本是關(guān)于在不同軟件中進(jìn)行分支操作的方法總結(jié),包括快捷鍵操作和軟件內(nèi)置操作兩種方式,并給出了操作的詳細(xì)步驟,方便讀者參考和學(xué)習(xí)
    2026-05-05
  • Quartz集群原理以及配置應(yīng)用的方法詳解

    Quartz集群原理以及配置應(yīng)用的方法詳解

    Quartz是Java領(lǐng)域最著名的開源任務(wù)調(diào)度工具。Quartz提供了極為廣泛的特性如持久化任務(wù),集群和分布式任務(wù)等,下面這篇文章主要給大家介紹了關(guān)于Quartz集群原理以及配置應(yīng)用的相關(guān)資料,需要的朋友可以參考下
    2018-05-05
  • Java使用PDFBox實(shí)現(xiàn)調(diào)整PDF每頁格式

    Java使用PDFBox實(shí)現(xiàn)調(diào)整PDF每頁格式

    這篇文章主要為大家詳細(xì)介紹了Java如何使用PDFBox實(shí)現(xiàn)調(diào)整PDF每頁格式,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下
    2024-03-03
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(26)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(26)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • Java中的異常和處理機(jī)制實(shí)例詳解

    Java中的異常和處理機(jī)制實(shí)例詳解

    這篇文章主要介紹了Java中的異常和處理機(jī)制,結(jié)合實(shí)例形式詳細(xì)分析了Java異常與處理機(jī)制的相關(guān)概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2019-05-05
  • java 一個(gè)類實(shí)現(xiàn)兩個(gè)接口的案例

    java 一個(gè)類實(shí)現(xiàn)兩個(gè)接口的案例

    這篇文章主要介紹了java 一個(gè)類實(shí)現(xiàn)兩個(gè)接口的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10

最新評(píng)論

芮城县| 西丰县| 阳新县| 双鸭山市| 洮南市| 县级市| 乡宁县| 沭阳县| 丹江口市| 台安县| 正镶白旗| 安顺市| 荥阳市| 龙门县| 石棉县| 苗栗县| 新巴尔虎右旗| 柘荣县| 丹寨县| 浪卡子县| 安多县| 阳谷县| 繁昌县| 收藏| 保山市| 达州市| 万载县| 东乌珠穆沁旗| 山阴县| 平舆县| 通州市| 米泉市| 大悟县| 沂南县| 博客| 阳新县| 同心县| 嘉禾县| 宁晋县| 开化县| 沈丘县|