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

Java中JWT(JSON?Web?Token)的運(yùn)用具體案例

 更新時間:2024年11月12日 09:36:59   作者:華農(nóng)第一蒟蒻  
這篇文章主要介紹了Java中JWT(JSON?Web?Token)的運(yùn)用具體案例,JWT(JSON?Web?Token)是一種開放標(biāo)準(zhǔn),用于在網(wǎng)絡(luò)應(yīng)用環(huán)境中安全地傳遞信息,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

JWT(JSON Web Token)是一種開放標(biāo)準(zhǔn)(RFC 7519),用于在網(wǎng)絡(luò)應(yīng)用環(huán)境間以緊湊的方式安全地傳遞信息。JWT可以被用作身份驗證和信息交換的手段,特別適合用于前后端分離的應(yīng)用程序。

1. JWT的結(jié)構(gòu)

JWT由三部分組成:

  • Header(頭部): 通常包含令牌的類型(JWT)和所使用的簽名算法(如HMAC SHA256或RSA)。

  • Payload(負(fù)載): 包含聲明(claims),即要傳遞的數(shù)據(jù)。其中可以包含注冊聲明(如 iss、exp、sub 等)和自定義聲明。

  • Signature(簽名): 用于驗證消息的完整性和發(fā)送者的身份。通過將編碼后的header和payload與一個密鑰結(jié)合,利用指定的算法生成。

JWT的格式如下:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

2. JWT的優(yōu)點(diǎn)

  • 無狀態(tài): 不需要在服務(wù)器存儲會話信息,減輕了服務(wù)器的負(fù)擔(dān)。
  • 跨域: 可以在不同的域之間進(jìn)行身份驗證。
  • 自包含: 含有用戶身份信息,避免頻繁查詢數(shù)據(jù)庫。

3. JWT的流轉(zhuǎn)過程

  • 用戶通過登錄接口發(fā)送用戶名和密碼。
  • 服務(wù)器驗證用戶信息,如果成功,則生成JWT并返回給用戶。
  • 用戶在后續(xù)請求中帶上JWT,通常放在HTTP請求的Authorization頭中。
  • 服務(wù)器解析JWT,驗證其有效性,允許或拒絕請求。

4.具體案例

好的,讓我們更詳細(xì)地探討如何在Java Spring Boot應(yīng)用程序中實現(xiàn)JWT身份驗證,包括每一步的代碼和說明。

一、項目結(jié)構(gòu)

Spring Boot項目結(jié)構(gòu)如下:

src
├── main
│   ├── java
│   │   └── com
│   │       └── example
│   │           └── jwt
│   │               ├── JwtApplication.java
│   │               ├── config
│   │               │   └── SecurityConfig.java
│   │               ├── controller
│   │               │   └── AuthController.java
│   │               ├── model
│   │               │   └── User.java
│   │               ├── service
│   │               │   └── JwtUtil.java
│   │               └── filter
│   │                   └── JwtRequestFilter.java
│   └── resources
│       └── application.properties
└── test

二、依賴配置

在pom.xml中添加必要的依賴:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version>
    </dependency>
</dependencies>

三、用戶模型

創(chuàng)建一個簡單的用戶模型:

package com.example.jwt.model;

public class User {
    private String username;
    private String password;

    // Constructors, getters, and setters
    //也可以使用Lombok
    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }
}

四、JWT工具類

創(chuàng)建JWT工具類,負(fù)責(zé)生成和解析JWT:

package com.example.jwt.service;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
*Jwt工具類
*/
@Component//加入Spring容器
public class JwtUtil {

    private String secret = "your_secret_key"; // 強(qiáng)密碼
    private long expiration = 60 * 60 * 1000; // 1小時

	//這個方法用于生成 JWT。它接受用戶名作為參數(shù)。
    public String generateToken(String username) {
        Map<String, Object> claims = new HashMap<>();
        return createToken(claims, username);
    }
	//私有方法,用于實際生成 JWT
    private String createToken(Map<String, Object> claims, String subject) {
        return Jwts.builder()//開始構(gòu)建 JWT 的構(gòu)建器
                .setClaims(claims)//設(shè)置 JWT 中的聲明
                .setSubject(subject)//設(shè)置主題(通常是用戶名)
                .setIssuedAt(new Date(System.currentTimeMillis()))//設(shè)置 JWT 的簽發(fā)時間
                .setExpiration(new Date(System.currentTimeMillis() + expiration))//設(shè)置 JWT 的過期時間
                .signWith(SignatureAlgorithm.HS256, secret)//使用指定的算法(HS256)和密鑰對 JWT 進(jìn)行簽名
                .compact();//生成最終的 JWT 字符串
    }
	//用于驗證給定的 JWT 是否有效。
    public Boolean validateToken(String token, String username) {
        final String extractedUsername = extractUsername(token);//提取 JWT 中的用戶名
        return (extractedUsername.equals(username) && !isTokenExpired(token));//檢查提取的用戶名與提供的用戶名是否匹配,并且檢查 JWT 是否未過期
    }
	//從 JWT 中提取用戶名
    public String extractUsername(String token) {
        return extractAllClaims(token).getSubject();
    }
	//解析 JWT 并返回所有聲明
    private Claims extractAllClaims(String token) {
        return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
    }//使用密鑰解析 JWT 獲取其主體部分(聲明)
    
	//檢查 JWT 是否已過期
    private Boolean isTokenExpired(String token) {
        return extractAllClaims(token).getExpiration().before(new Date());
    }
}

五、JWT請求過濾器

創(chuàng)建JWT請求過濾器,用于攔截請求并驗證JWT:

package com.example.jwt.filter;

import com.example.jwt.service.JwtUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component // 將該類標(biāo)記為 Spring 組件,以便自動掃描和管理
public class JwtRequestFilter extends OncePerRequestFilter {

    @Autowired // 自動注入 JwtUtil 實例
    private JwtUtil jwtUtil;

    @Autowired // 自動注入 UserDetailsService 實例
    private UserDetailsService userDetailsService;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {
        // 從請求中獲取 Authorization 頭部
        final String authorizationHeader = request.getHeader("Authorization");

        String username = null; // 初始化用戶名
        String jwt = null; // 初始化 JWT 令牌

        // 檢查 Authorization 頭部是否存在且以 "Bearer " 開頭
        if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
            // 提取 JWT 令牌(去掉 "Bearer " 前綴)
            jwt = authorizationHeader.substring(7);
            // 從 JWT 中提取用戶名
            username = jwtUtil.extractUsername(jwt);
        }

        // 如果用戶名不為空且當(dāng)前 SecurityContext 沒有身份驗證信息
        if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
            // 根據(jù)用戶名加載用戶詳細(xì)信息
            UserDetails userDetails = userDetailsService.loadUserByUsername(username);
            
            // 驗證 JWT 是否有效
            if (jwtUtil.validateToken(jwt, userDetails.getUsername())) {
                // 創(chuàng)建身份驗證令牌,并設(shè)置用戶的權(quán)限
                UsernamePasswordAuthenticationToken authenticationToken =
                        new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
                
                // 設(shè)置請求的詳細(xì)信息
                authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
                
                // 將身份驗證信息存入 SecurityContext
                SecurityContextHolder.getContext().setAuthentication(authenticationToken);
            }
        }
        
        // 繼續(xù)過濾器鏈
        chain.doFilter(request, response);
    }
}

六、安全配置

配置Spring Security,以保護(hù)API并使用JWT:

package com.example.jwt.config;

import com.example.jwt.filter.JwtRequestFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
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.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private JwtRequestFilter jwtRequestFilter;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/auth/login").permitAll() // 公開登錄接口
            .anyRequest().authenticated() // 其他接口需要認(rèn)證
            .and()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); // 無狀態(tài)會話

        // 添加JWT過濾器
        http.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user").password(passwordEncoder().encode("password")).roles("USER"); // 示例用戶
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

七、身份驗證控制器

創(chuàng)建一個控制器來處理登錄請求并返回JWT:

package com.example.jwt.controller;

import com.example.jwt.model.User;
import com.example.jwt.service.JwtUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/auth")
public class AuthController {

    @Autowired
    private JwtUtil jwtUtil;

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private UserDetailsService userDetailsService;

    @PostMapping("/login")
    public String login(@RequestBody User user) {
        try {
            authenticationManager.authenticate(
                    new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword())
            );
        } catch (Exception e) {
            throw new RuntimeException("Invalid credentials");
        }

        final UserDetails userDetails = userDetailsService.loadUserByUsername(user.getUsername());
        return jwtUtil.generateToken(userDetails.getUsername());
    }
}

八、測試JWT

  • 啟動Spring Boot應(yīng)用程序。
  • 使用Postman或其他工具測試登錄接口。

請求示例:

POST /auth/login
Content-Type: application/json

{
    "username": "user",
    "password": "password"
}

響應(yīng)示例:

{
    "token": "eyJhbGciOiJIUzI1NiIsInR5c..."
}
  • 使用返回的token訪問受保護(hù)的資源:
GET /protected/resource
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5c...

總結(jié) 

到此這篇關(guān)于Java中JWT(JSON Web Token)運(yùn)用的文章就介紹到這了,更多相關(guān)Java中JWT的運(yùn)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java項目如何打包成Jar的實現(xiàn)步驟

    Java項目如何打包成Jar的實現(xiàn)步驟

    一般情況下我們都是使用Java項目直接部署發(fā)布,有時需要我們將寫好的項目打成jar包,方便后期調(diào)用,本文主要介紹了Java項目如何打包成Jar,感興趣的可以了解一下
    2023-11-11
  • SpringBoot整合Thymeleaf的方法

    SpringBoot整合Thymeleaf的方法

    這篇文章主要介紹了SpringBoot整合Thymeleaf的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • 借助Maven搭建Hadoop開發(fā)環(huán)境的最詳細(xì)教程分享

    借助Maven搭建Hadoop開發(fā)環(huán)境的最詳細(xì)教程分享

    在Maven插件的幫助下,VSCode寫Java其實非常方便,所以本文就來和大家詳細(xì)講講如何借助maven用VScode搭建Hadoop開發(fā)環(huán)境,需要的可以參考下
    2023-05-05
  • 利用SpringBoot實現(xiàn)一個基于本地代理模式的RPC調(diào)用框架

    利用SpringBoot實現(xiàn)一個基于本地代理模式的RPC調(diào)用框架

    雖然Dubbo、gRPC等成熟框架已經(jīng)為我們提供了完整的RPC解決方案,但理解其底層原理并動手實現(xiàn)一個簡化版本,對提升我們的技術(shù)理解深度很有幫助,下面我們就來看看如何使用SpringBoot實現(xiàn)一個基于本地代理模式的RPC調(diào)用框架吧
    2025-07-07
  • java + dom4j.jar提取xml文檔內(nèi)容

    java + dom4j.jar提取xml文檔內(nèi)容

    這篇文章主要為大家詳細(xì)介紹了java + dom4j.jar提取xml文檔內(nèi)容,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • SpringBoot項目集成Smart-Doc的實戰(zhàn)指南

    SpringBoot項目集成Smart-Doc的實戰(zhàn)指南

    Smart-Doc是一款強(qiáng)大的基于Java的API文檔生成工具,它通過對接口源代碼進(jìn)行分析來生成全面而準(zhǔn)確的文檔,完全不需要對代碼進(jìn)行任何注入,下面我們看看如何在SpringBoot項目中集成Smart-Doc吧
    2025-10-10
  • mybatis的使用-Mapper文件各種語法介紹

    mybatis的使用-Mapper文件各種語法介紹

    這篇文章主要介紹了mybatis的使用-Mapper文件各種語法介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • java中String、StringBuffer與StringBuilder的區(qū)別

    java中String、StringBuffer與StringBuilder的區(qū)別

    這篇文章主要介紹了java 中String和StringBuffer與StringBuilder的區(qū)別,在開發(fā)過程中經(jīng)常會用到String這個類進(jìn)行操作。需要的朋友可以收藏下,方便下次瀏覽觀看
    2021-12-12
  • Java將Word轉(zhuǎn)換成PDF的常用用法

    Java將Word轉(zhuǎn)換成PDF的常用用法

    Java開發(fā)人員在處理文檔轉(zhuǎn)換時,常常需要將Word或Excel文檔轉(zhuǎn)換為PDF格式,以便于更好地保持格式一致性、便于分發(fā)和打印,這篇文章主要給大家介紹了關(guān)于Java將Word轉(zhuǎn)換成PDF的常用用法,需要的朋友可以參考下
    2024-08-08
  • JAVA對稱加密算法PBE定義與用法實例分析

    JAVA對稱加密算法PBE定義與用法實例分析

    這篇文章主要介紹了JAVA對稱加密算法PBE定義與用法,結(jié)合實例形式分析了JAVA對稱加密算法PBE的概念、原理、定義及使用方法,需要的朋友可以參考下
    2019-09-09

最新評論

朔州市| 垦利县| 桐庐县| 台南市| 遂平县| 曲松县| 万山特区| 长白| 辽中县| 偏关县| 鲜城| 奎屯市| 永登县| 贡嘎县| 六枝特区| 赤水市| 武穴市| 淮北市| 三河市| 喀什市| 马山县| 宜兴市| 米泉市| 鹤壁市| 正蓝旗| 乐都县| 兴国县| 怀柔区| 遵义县| 林甸县| 察隅县| 扶余县| 乡城县| 运城市| 原阳县| 子洲县| 屏南县| 酒泉市| 娄烦县| 岳阳县| 博湖县|