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

SpringBoot集成JWT無狀態(tài)身份認(rèn)證的方案詳解

 更新時間:2025年11月18日 09:20:53   作者:t***L266  
本文介紹了如何在SpringBoot項目中集成JWT實(shí)現(xiàn)無狀態(tài)身份認(rèn)證,JWT由Header、Payload和Signature三部分組成,通過添加JJWT依賴,創(chuàng)建JWT工具類和認(rèn)證攔截器,實(shí)現(xiàn)前后端的交互流程,需要注意安全性、性能優(yōu)化和常見問題,感興趣的朋友跟隨小編一起看看吧

 SpringBoot集成JWT實(shí)現(xiàn)無狀態(tài)身份認(rèn)證實(shí)戰(zhàn)

在現(xiàn)代Web應(yīng)用中,身份認(rèn)證是必不可少的安全環(huán)節(jié)。傳統(tǒng)的基于Session的認(rèn)證方式雖然簡單易用,但在微服務(wù)架構(gòu)和前端多平臺場景下,面臨著擴(kuò)展性差和服務(wù)器存儲壓力大等問題。本文將介紹如何在SpringBoot項目中集成JWT(Json Web Token)實(shí)現(xiàn)無狀態(tài)的身份認(rèn)證方案。

 一、什么是JWT

JWT是一種開放標(biāo)準(zhǔn)(RFC 7519),定義了一種緊湊且自包含的方式,用于在各方之間安全傳輸信息作為JSON對象。JWT由三部分組成:

1. **Header**:包含令牌類型和使用的哈希算法

2. **Payload**:存放有效信息的負(fù)載部分

3. **Signature**:對前兩部分進(jìn)行簽名,防止數(shù)據(jù)篡改

典型的JWT格式:`xxxxx.yyyyy.zzzzz`

 二、SpringBoot集成JJWT

首先,在pom.xml中添加JJWT依賴:

<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>

創(chuàng)建JWT工具類`JwtUtils.java`:

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.crypto.SecretKey;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Component
public class JwtUtils {
@Value("${jwt.secret}")
private String secret;
@Value("${jwt.expiration}")
private long expiration;
// 生成token
public String generateToken(String username) {
Map<String, Object> claims = new HashMap<>();
SecretKey key = Keys.hmacShaKeyFor(secret.getBytes());
return Jwts.builder()
.setClaims(claims)
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + expiration * 1000))
.signWith(key, SignatureAlgorithm.HS256)
.compact();
}
// 解析token獲取用戶名
public String getUsernameFromToken(String token) {
SecretKey key = Keys.hmacShaKeyFor(secret.getBytes());
return Jwts.parserBuilder()
.setSigningKey(key)
.build()
.parseClaimsJws(token)
.getBody()
.getSubject();
}
// 驗證token是否有效
public boolean validateToken(String token) {
try {
SecretKey key = Keys.hmacShaKeyFor(secret.getBytes());
Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token);
return true;
} catch (Exception e) {
return false;
}
}
}

 三、實(shí)現(xiàn)認(rèn)證攔截器

創(chuàng)建JWT認(rèn)證攔截器`JwtAuthenticationFilter.java`:

@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Autowired
private JwtUtils jwtUtils;
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain chain)
throws ServletException, IOException {
String token = request.getHeader("Authorization");
// 如果請求頭中沒有token,直接放行
if (StringUtils.isEmpty(token)) {
chain.doFilter(request, response);
return;
}
// 驗證token有效性
if (!jwtUtils.validateToken(token)) {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
response.getWriter().write("無效的Token");
return;
}
// 獲取用戶名并設(shè)置到SecurityContext中
String username = jwtUtils.getUsernameFromToken(token);
UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>());
SecurityContextHolder.getContext().setAuthentication(authentication);
chain.doFilter(request, response);
}
}

配置攔截器注冊:

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private JwtAuthenticationFilter jwtAuthenticationFilter;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.anyRequest().authenticated()
.and()
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
}
}

 四、前后端交互流程

1. **登錄流程**:

- 客戶端發(fā)送用戶名密碼到`/api/auth/login`

- 服務(wù)器驗證成功后生成JWT返回給客戶端

- 客戶端將JWT存儲在本地(localStorage或cookie)

2. **后續(xù)請求**:

- 客戶端在請求頭中添加`Authorization: Bearer <JWT>`

- 服務(wù)器驗證JWT有效性后處理請求

 五、注意事項

1. **安全性**:

- 必須使用HTTPS傳輸JWT

- 設(shè)置較短的過期時間,結(jié)合Refresh Token實(shí)現(xiàn)自動續(xù)期

- JWT一旦發(fā)出無法撤回,處理敏感操作應(yīng)額外驗證密碼

2. **性能優(yōu)化**:

- 避免在JWT中存儲過多信息

- 可以考慮將部分用戶信息緩存在Redis中

3. **常見問題**:

- 密鑰泄露問題:定期更換密鑰

- CSRF攻擊:配合CSRF Token使用

通過本文介紹的方案,我們可以在SpringBoot項目中輕松實(shí)現(xiàn)基于JWT的無狀態(tài)認(rèn)證。相比傳統(tǒng)Session驗證,JWT方案更適合現(xiàn)代分布式系統(tǒng)的認(rèn)證需求,具有諸多優(yōu)勢。

到此這篇關(guān)于SpringBoot集成JWT無狀態(tài)身份認(rèn)證的文章就介紹到這了,更多相關(guān)SpringBoot JWT無狀態(tài)身份認(rèn)證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot controller參數(shù)注入方式

    springboot controller參數(shù)注入方式

    這篇文章主要介紹了springboot controller參數(shù)注入方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Spring擴(kuò)展接口知識總結(jié)

    Spring擴(kuò)展接口知識總結(jié)

    今天帶大家學(xué)習(xí)Java Spring的相關(guān)知識,文中對Spring擴(kuò)展接口作了非常詳細(xì)的介紹及代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • Java 靜態(tài)數(shù)據(jù)初始化的示例代碼

    Java 靜態(tài)數(shù)據(jù)初始化的示例代碼

    這篇文章主要介紹了Java 靜態(tài)數(shù)據(jù)初始化的示例代碼,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-09-09
  • Spring Boot 應(yīng)用程序啟動時執(zhí)行完整流程(最新推薦)

    Spring Boot 應(yīng)用程序啟動時執(zhí)行完整流程(最新推薦)

    本文給大家介紹關(guān)于Spring Boot應(yīng)用程序啟動時main方法的完整執(zhí)行流程,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-11-11
  • Spring、SpringMvc和SpringBoot的區(qū)別及說明

    Spring、SpringMvc和SpringBoot的區(qū)別及說明

    Spring框架提供了全面的Java開發(fā)解決方案,核心包括IOC和AOP,SpringMvc作為其中的WEB層開發(fā)框架,通過復(fù)雜的XML配置管理前端視圖和后臺邏輯,SpringBoot則簡化了配置,專注于微服務(wù)接口開發(fā),支持嵌入式服務(wù)器,提高了開發(fā)效率
    2024-10-10
  • Java資源加載機(jī)制及使用最佳實(shí)踐

    Java資源加載機(jī)制及使用最佳實(shí)踐

    Java類加載器的資源加載機(jī)制,包括`getResource`、`getResources`、`findResource`、`findResources`等方法,本文給大家介紹Java資源加載機(jī)制及使用最佳實(shí)踐,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • MyBatis-Plus多表聯(lián)合查詢并且分頁(3表聯(lián)合)

    MyBatis-Plus多表聯(lián)合查詢并且分頁(3表聯(lián)合)

    這篇文章主要介紹了MyBatis-Plus多表聯(lián)合查詢并且分頁(3表聯(lián)合),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • AsyncHttpClient?RequestFilter請求篩選源碼解讀

    AsyncHttpClient?RequestFilter請求篩選源碼解讀

    這篇文章主要為大家介紹了AsyncHttpClient?RequestFilter請求篩選源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • ScheduledThreadPoolExecutor巨坑解決

    ScheduledThreadPoolExecutor巨坑解決

    這篇文章主要為大家介紹了使用ScheduledThreadPoolExecutor遇到的巨坑解決示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Java中Swagger生成后端接口測試的詳細(xì)教程

    Java中Swagger生成后端接口測試的詳細(xì)教程

    Swagger是一套圍繞OpenAPI規(guī)范構(gòu)建的開源工具集,用于設(shè)計、構(gòu)建、文檔化和消費(fèi)RESTful Web服務(wù),供了一種標(biāo)準(zhǔn)化、語言無關(guān)的接口來描述REST API,本文給大家介紹了Java中Swagger生成后端接口測試的詳細(xì)教程,需要的朋友可以參考下
    2025-06-06

最新評論

沅江市| 桂平市| 周至县| 吴桥县| 襄汾县| 河东区| 布尔津县| 江都市| 三明市| 聊城市| 夏邑县| 平度市| 漳平市| 凌源市| 丽江市| 鄄城县| 辛集市| 揭西县| 庄河市| 仁怀市| 金坛市| 洪雅县| 明水县| 秀山| 凌云县| 建瓯市| 阿勒泰市| 汕尾市| 高平市| 卢氏县| 策勒县| 建阳市| 惠水县| 昌平区| 柳河县| 沅江市| 犍为县| 新宾| 潢川县| 长宁县| 和静县|