当前位置:首页 > Java

java如何配置jwt

2026-03-25 22:11:59Java

配置 JWT 在 Java 中的步骤

添加依赖

在 Maven 项目中,添加以下依赖到 pom.xml 文件:

<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>

生成 JWT Token

使用 io.jsonwebtoken 库生成 JWT Token:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import java.security.Key;
import java.util.Date;

Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
String token = Jwts.builder()
    .setSubject("user123")
    .setIssuedAt(new Date())
    .setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 1小时后过期
    .signWith(key)
    .compact();

解析 JWT Token

验证并解析 JWT Token:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;

Jws<Claims> claimsJws = Jwts.parserBuilder()
    .setSigningKey(key)
    .build()
    .parseClaimsJws(token);
Claims claims = claimsJws.getBody();
String username = claims.getSubject();

配置 JWT 密钥

建议将密钥存储在安全的地方(如环境变量或配置文件中):

java如何配置jwt

String secretKey = System.getenv("JWT_SECRET");
Key key = Keys.hmacShaKeyFor(secretKey.getBytes());

集成到 Spring Security

在 Spring Boot 项目中,可以通过 SecurityConfig 配置 JWT 过滤器:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .addFilterBefore(new JwtTokenFilter(), UsernamePasswordAuthenticationFilter.class)
            .authorizeRequests()
            .antMatchers("/api/public/").permitAll()
            .anyRequest().authenticated();
    }
}

创建 JWT 过滤器

实现 OncePerRequestFilter 来验证 JWT:

java如何配置jwt

public class JwtTokenFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        String token = extractToken(request);
        if (token != null && validateToken(token)) {
            Authentication auth = getAuthentication(token);
            SecurityContextHolder.getContext().setAuthentication(auth);
        }
        filterChain.doFilter(request, response);
    }
}

设置 Token 过期时间

通过 setExpiration 方法控制 Token 有效期:

Date expiryDate = new Date(System.currentTimeMillis() + 86400000); // 24小时
String token = Jwts.builder()
    .setExpiration(expiryDate)
    .signWith(key)
    .compact();

自定义 Claims

在 Token 中添加自定义数据:

String token = Jwts.builder()
    .claim("role", "admin")
    .claim("userId", 12345)
    .signWith(key)
    .compact();

异常处理

捕获并处理 JWT 解析时的异常:

try {
    Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token);
} catch (ExpiredJwtException e) {
    // Token 过期
} catch (JwtException e) {
    // 无效 Token
}

注意事项

  • 密钥需足够复杂,推荐使用 Keys.secretKeyFor(SignatureAlgorithm.HS256) 生成。
  • 避免在 Token 中存储敏感信息。
  • 生产环境应启用 HTTPS 以防止 Token 被截获。
  • 定期轮换密钥以提高安全性。

标签: javajwt
分享给朋友:

相关文章

java如何上传文件

java如何上传文件

使用HttpURLConnection上传文件 在Java中,可以通过HttpURLConnection实现文件上传功能。需要设置请求头为multipart/form-data,并构建包含文件数据的请…

java如何打印数组

java如何打印数组

打印数组的方法 在Java中,打印数组有多种方式,以下是几种常见的方法: 使用Arrays.toString()方法 这种方法适用于一维数组,可以快速将数组转换为字符串形式输出: int[] a…

java如何连接mysql数据库

java如何连接mysql数据库

连接 MySQL 数据库的步骤 添加 MySQL 驱动依赖 在项目中引入 MySQL 的 JDBC 驱动。如果使用 Maven,可以在 pom.xml 中添加以下依赖: <dependency…

eclipse如何创建java

eclipse如何创建java

在Eclipse中创建Java项目 打开Eclipse后,选择菜单栏中的"File" -> "New" -> "Java Project"。在弹出的对话框中输入项目名称,确保"Use de…

如何升级java

如何升级java

检查当前Java版本 在升级之前,需确认当前安装的Java版本。在终端或命令提示符中运行以下命令: java -version 输出会显示当前Java版本(如1.8.0_301或17.0.2)。…

java实现vue接口

java实现vue接口

Java 实现 Vue 接口的方法 在 Java 中实现 Vue 前端调用的接口,通常需要使用 Spring Boot 框架构建 RESTful API。以下是具体的实现步骤和代码示例。 创建 Sp…