东莞做网站首选,thinkphp做企业网站,crm免费,电商网站怎么做seo优化怎么使用jwt#xff0c;token以及redis进行续期#xff1f; 什么是jwt? 什么是token? 结合 JWT、Token 和 Redis 进行续期的一般步骤#xff1a; 生成 JWT#xff1a; 用户登录成功后#xff0c;服务器生成一个 JWT#xff0c;并返回给客户端。 import io.jsonwebtok…怎么使用jwttoken以及redis进行续期 什么是jwt? 什么是token? 结合 JWT、Token 和 Redis 进行续期的一般步骤 生成 JWT 用户登录成功后服务器生成一个 JWT并返回给客户端。 import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;public class JwtUtil {private static final String SECRET_KEY yourSecretKey;public static String generateToken(String subject) {return Jwts.builder().setSubject(subject).signWith(SignatureAlgorithm.HS256, SECRET_KEY).compact();}
}将 JWT 存储到 Redis 服务器将生成的 JWT 存储到 Redis 中以便后续验证和续期。 import redis.clients.jedis.Jedis;public class RedisUtil {private static final String REDIS_HOST localhost;private static final int REDIS_PORT 6379;public static void storeTokenInRedis(String key, String token) {try (Jedis jedis new Jedis(REDIS_HOST, REDIS_PORT)) {jedis.set(key, token);}}
}客户端保存 JWT 客户端收到 JWT 后将其保存在本地通常可以存储在 Local Storage 或者 Session Storage 中。 LocalStorage 或 SessionStorage 在 Web 应用中可以将 JWT 存储在浏览器的 LocalStorage 或 SessionStorage 中。这些存储方式都是客户端本地的存储机制可以通过 JavaScript API 进行读写操作。LocalStorage 的数据会一直保存除非用户手动清除而 SessionStorage 的数据则只在当前会话期间有效。 // 将 JWT 存储到 LocalStorage
localStorage.setItem(jwtToken, token);// 从 LocalStorage 获取 JWT
const token localStorage.getItem(jwtToken);Cookie 另一种常见的方式是将 JWT 存储在 Cookie 中。通过设置 Cookie 的方式可以在客户端和服务器之间进行自动传递而不需要显式地在请求头中添加 JWT。 // 将 JWT 存储到 Cookie
document.cookie jwtToken${token}; path/;;// 从 Cookie 获取 JWT
const token document.cookie.split(; ).find(row row.startsWith(jwtToken)).split()[1];内存 在某些情况下可以将 JWT 存储在客户端的内存中。这种方式通常用于移动应用或桌面应用等场景不适用于 Web 应用因为 Web 页面刷新或关闭后内存中的数据会丢失。 // 在 Java 中使用内存保存 JWT 的示例
String jwtToken;使用 JWT 进行身份验证 客户端在每次请求需要身份验证的资源时将 JWT 放置在请求头中发送给服务器。 import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;public class JwtUtil {private static final String SECRET_KEY yourSecretKey;public static boolean verifyToken(String token) {try {JwsClaims claims Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);return true;} catch (Exception e) {return false;}}
}验证 JWT 的有效性 服务器收到请求后验证 JWT 的签名和有效期等信息以确认其有效性。 解析 JWT 首先需要解析 JWT并验证其格式是否正确。JWT 通常由三部分组成Header、Payload 和 Signature。可以使用相应的库或工具来解析 JWT确保它们符合 JWT 的标准格式。验证签名 JWT 的 Signature 部分由 Header 和 Payload 使用指定的算法签名而成。为了验证 JWT 的真实性需要使用相同的密钥和算法对 Header 和 Payload 进行签名并与 JWT 中的 Signature 进行比较。如果两者匹配则说明 JWT 没有被篡改过。检查过期时间 JWT 中通常会包含一个过期时间exp字段表示 JWT 的有效期。需要检查当前时间是否晚于过期时间以确保 JWT 尚未过期。可选验证其他声明 JWT 中可能包含其他自定义声明如用户角色、权限等。根据应用需求可以对这些声明进行验证以确保 JWT 的合法性。 下面是一个使用 Java 的示例代码演示如何验证 JWT 的有效性 import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import java.security.Key;
import java.util.Date;public class JwtUtil {private static final String SECRET_KEY yourSecretKey;public static boolean validateJwt(String token) {try {Claims claims Jwts.parserBuilder().setSigningKey(Keys.hmacShaKeyFor(SECRET_KEY.getBytes())).build().parseClaimsJws(token).getBody();// 验证过期时间Date expiration claims.getExpiration();if (expiration ! null expiration.before(new Date())) {return false; // JWT 已过期}// 可选其他声明的验证// String username claims.getSubject();// ListString roles (ListString) claims.get(roles);// 进行额外的声明验证return true; // JWT 验证通过} catch (Exception e) {return false; // JWT 验证失败}}
}在上述代码中validateJwt 方法接受一个 JWT并返回一个布尔值指示该 JWT 是否有效。如果 JWT 有效则返回 true否则返回 false。 检查 JWT 的过期时间 如果 JWT 即将过期服务器可以发出一个新的 JWT并更新 Redis 中的对应信息。 在第五步中已完成 续期 JWT 服务器根据业务逻辑和安全策略决定是否续期 JWT。如果续期则生成一个新的 JWT更新 Redis 中的相关信息并将新的 JWT 返回给客户端。 public class JwtUtil {private static final String SECRET_KEY yourSecretKey;private static final long EXPIRATION_TIME 86400000L; // 24小时public static String refreshToken(String subject) {return Jwts.builder().setSubject(subject).setExpiration(new Date(System.currentTimeMillis() EXPIRATION_TIME)).signWith(SignatureAlgorithm.HS256, SECRET_KEY).compact();}
}客户端更新 JWT 客户端收到新的 JWT 后将其替换掉旧的 JWT并更新本地存储中的 Token。 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;public class UpdateJWTClient {private static String jwtToken ; // 存储 JWT 的变量初始为空public static void main(String[] args) {// 模拟从服务器获取新的 JWTString newJWT fetchNewJWT();if (newJWT ! null !newJWT.isEmpty()) {// 替换旧的 JWT 并更新本地存储中的 TokenupdateJWT(newJWT);// 使用新的 JWT 发送请求sendRequestWithNewJWT();} else {System.out.println(Failed to fetch new JWT.);}}// 模拟从服务器获取新的 JWTprivate static String fetchNewJWT() {// 这里应该发送 HTTP 请求到服务器获取新的 JWT// 这里简化为直接返回一个模拟的 JWTreturn new.jwt.token.example;}// 替换旧的 JWT 并更新本地存储中的 Tokenprivate static void updateJWT(String newToken) {jwtToken newToken; // 替换旧的 JWT// 这里应该将新的 JWT 存储在本地例如使用 SharedPreferences// 这里简化为打印出来System.out.println(Updated JWT: jwtToken);}// 使用新的 JWT 发送请求private static void sendRequestWithNewJWT() {try {URL url new URL(https://example.com/api/resource);HttpURLConnection connection (HttpURLConnection) url.openConnection();connection.setRequestMethod(GET);connection.setRequestProperty(Authorization, Bearer jwtToken);int responseCode connection.getResponseCode();if (responseCode HttpURLConnection.HTTP_OK) {// 请求成功读取响应BufferedReader reader new BufferedReader(new InputStreamReader(connection.getInputStream()));String inputLine;StringBuffer response new StringBuffer();while ((inputLine reader.readLine()) ! null) {response.append(inputLine);}reader.close();System.out.println(Response: response.toString());} else {// 请求失败System.out.println(Failed to send request. Response code: responseCode);}} catch (IOException e) {e.printStackTrace();}}
}在这个示例中fetchNewJWT 方法模拟了从服务器获取新的 JWT实际情况下应该发送 HTTP 请求到服务器获取。然后updateJWT 方法用新的 JWT 替换旧的 JWT并更新本地存储中的 Token。最后sendRequestWithNewJWT 方法使用新的 JWT 发送请求到服务器。