当Java应用需要进行用户验证和授权时,常用的方案之一是使用JWT(JSON Web Token)。JWT是一种基于JSON格式的安全传输令牌,通过使用JWT能够实现用户身份认证和授权信息的传递。
以下是Java使用JWT的方法的完整攻略。
1. 导入相关依赖
为了使用JWT,我们需要在Java应用中导入相关依赖。可以通过在maven的pom.xml文件中添加以下依赖来完成此操作。
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
2. 创建JWT Token
在Java中,可以使用jjwt库来创建JWT Token。示例代码如下:
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public static String createJWT(String id, String issuer, String subject, long ttlMillis, String secretKey) {
// 在ttlMillis毫秒后过期
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
// 利用id和密钥创建加密的签名密钥
byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(secretKey);
Key signingKey = new SecretKeySpec(apiKeySecretBytes, SignatureAlgorithm.HS256.getJcaName());
// 设置JWT的头部
JwtBuilder builder = Jwts.builder()
.setId(id)
.setIssuedAt(now)
.setSubject(subject)
.setIssuer(issuer)
.signWith(SignatureAlgorithm.HS256, signingKey);
// 添加过期时间
if (ttlMillis >= 0) {
long expMillis = nowMillis + ttlMillis;
Date exp = new Date(expMillis);
builder.setExpiration(exp);
}
// 生成JWT并返回
return builder.compact();
}
3. 解析JWT Token
在Java中,可以使用jjwt库来解析JWT Token。示例代码如下:
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
public static Claims parseJWT(String jwt, String secretKey) {
// 利用密钥解密JWT
byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(secretKey);
Key signingKey = new SecretKeySpec(apiKeySecretBytes, SignatureAlgorithm.HS256.getJcaName());
// 解析JWT并返回
return Jwts.parser()
.setSigningKey(signingKey)
.parseClaimsJws(jwt).getBody();
}
示例1:JWT的生成和解析
假设我们需要生成和解析一个JWT,该JWT的载荷包含用户ID、用户名和过期时间。我们可以使用以下代码来完成此操作:
// 密钥
String secretKey = "thisIsASecretKey";
// 生成JWT
String jwt = createJWT("userId", "issuer", "userName", 3600000, secretKey);
System.out.println("JWT: " + jwt);
// 解析JWT
Claims claims = parseJWT(jwt, secretKey);
System.out.println("UserId: " + claims.getId());
System.out.println("Issuer: " + claims.getIssuer());
System.out.println("UserName: " + claims.getSubject());
System.out.println("ExpireTime: " + claims.getExpiration());
示例2:使用过滤器验证用户信息
在Java Web应用中,通常会在请求被处理之前使用过滤器对用户进行验证。下面是一个通过JWT Token进行用户验证的过滤器示例。
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter(filterName = "authFilter", urlPatterns = "/api/*")
public class AuthFilter implements Filter {
private String secretKey = "thisIsASecretKey";
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String jwt = request.getHeader("Authorization");
if (jwt != null && jwt.startsWith("Bearer ")) {
jwt = jwt.substring(7);
try {
Claims claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwt).getBody();
request.setAttribute("userId", claims.getId());
request.setAttribute("userName", claims.getSubject());
filterChain.doFilter(request, response);
} catch (Exception e) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
}
} else {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
}
}
@Override
public void destroy() {
}
}
上述过滤器会拦截所有以/api/开头的请求,并从请求头中获取JWT Token进行解析,如果解析成功,则将用户ID和用户名添加到ServletRequest中,否则返回401 Unauthorized状态码。 Web应用中的控制器类可以从ServletRequest中获取用户信息进行后续处理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java使用JWT的方法 - Python技术站