首先需要明确一下,JWT Token是无状态的,也就是说服务端不会在自己的内存中保存任何与Token相关的信息,也不会主动去刷新Token的过期时间。因此,如果要刷新Token的过期时间,需要客户端主动发起请求,从而获取一个新的Token。

为了实现Token的刷新和更换,可以在服务端设置一个特定的接口,用于接收客户端发送的Token并进行验证。如果验证通过,服务端会生成一个新的Token并将其返回给客户端。客户端在收到新的Token后,可以将其保存在本地,并在以后的请求中将其添加到请求头中,从而保证后续的请求都能够被正确地处理。

以下是一个简单的Java代码示例,演示了如何实现Token的刷新和更换:

@RestController
public class TokenController {

    // Token过期时间,单位为秒
    private static final long EXPIRATION_TIME = 3600;

    // Token密钥,需要自行设置
    private static final String SECRET_KEY = "my_secret_key";

    // 刷新Token的接口
    @PostMapping("/refreshToken")
    public ResponseEntity<?> refreshToken(@RequestHeader("Authorization") String token) {
        try {
            // 验证Token是否合法
            Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);

            // 生成新的Token
            String newToken = Jwts.builder()
                    .setSubject("user_id")
                    .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME * 1000))
                    .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
                    .compact();

            // 将新的Token返回给客户端
            return ResponseEntity.ok(newToken);
        } catch (JwtException e) {
            // Token验证失败,返回401错误码
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
        }
    }
}

客户端可以在发送请求时,在请求头中添加Authorization字段,将Token作为其值发送给服务端。如果服务端返回了一个新的Token,则客户端可以将其保存在本地,并在以后的请求中使用该Token发送请求。

以下是一个简单的Java代码示例,演示了如何在请求中添加Token:

public class MyHttpClient {

    // 发送请求的方法
    public void sendRequest(String url, String token) {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .header("Authorization", token)
                .build();

        client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
                .thenApply(HttpResponse::body)
                .thenAccept(System.out::println)
                .join();
    }
}

如果服务端在验证Token时发现Token已经过期,则可以返回一个特定的错误码,告知客户端需要刷新Token。客户端在收到该错误码后,可以请求刷新Token的接口,获取一个新的Token,并重新发送之前的请求。

以下是一个简单的Java代码示例,演示了如何在服务端返回特定的错误码:

@RestControllerAdvice
public class ExceptionHandler {

    // Token过期错误处理
    @ExceptionHandler(ExpiredJwtException.class)
    public ResponseEntity<?> handleExpiredJwtException() {
        // 返回401错误码,告知客户端需要刷新Token
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Token expired");
    }
}

客户端在收到该错误码后,可以进行如下操作:

public class MyHttpClient {

    // 发送请求的方法
    public void sendRequest(String url, String token) {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .header("Authorization", token)
                .build();

        client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
                .thenApply(HttpResponse::body)
                .exceptionally(throwable -> {
                    if (throwable.getCause() instanceof HttpResponseException) {
                        HttpResponseException exception = (HttpResponseException) throwable.getCause();
                        if (exception.getStatusCode() == HttpStatus.UNAUTHORIZED.value()) {
                            // Token过期,需要刷新Token
                            String newToken = refreshAccessToken(token);
                            if (newToken != null) {
                                // 刷新Token成功,重新发送请求
                                return sendRequest(url, newToken);
                            }
                        }
                    }
                    return null;
                })
                .thenAccept(System.out::println)
                .join();
    }

    // 刷新Token的方法
    private String refreshAccessToken(String token) {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("http://localhost:8080/refreshToken"))
                .header("Authorization", token)
                .POST(HttpRequest.BodyPublishers.noBody())
                .build();

        try {
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
            if (response.statusCode() == HttpStatus.OK.value()) {
                // 刷新Token成功,返回新的Token
                return response.body();
            }
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }
}
``
java 微信小程序使用 jwt token如何刷新token过期时间如何更换token保持请求发送成功后客户端怎么重新发送请求服务端怎么返回特定错误码详细代码

原文地址: https://www.cveoy.top/t/topic/fGDE 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录