Lỗi java liên quan đến dùng chung bộ nhớ

Mình đang code về jwt, đang muốn access token và refresh token, mỗi cái một thuật toán khác nhau như này:

    public static final String SECRET = "7134743777217A24432646294A404E635266556A586E3272357538782F413F44";

    public static final Integer EXPIRE_DURATION = 1000 * 60 * 1; // 1 minutes

    public static final Integer TOKEN_LIFETIME = 1000 * 60 * 1; // 1 minutes
    // defaut header
    private JwsHeader getHeader() {
        JwsHeader header = new DefaultJwsHeader();
        header.setType("JWT");
        header.setAlgorithm("HS256");
        return header;
    }

    // refresh header
    private JwsHeader getHeaderRefresh() {
        JwsHeader header = new DefaultJwsHeader();
        header.setType("JWT");
        header.setAlgorithm("RS256");
        return header;
    }

    // signature
    public String generateToken(String username) {
        log.info("generate jwt ...");
        return createToken(getHeader(), setPayload(username));
    }

    public String generateRefreshToken(String username) {
        log.info("generate refresh token ...");
        return createToken(getHeaderRefresh(), setPayloadRefresh(username));
    }

    // payload
    private Claims setPayload(String username) {
        Claims claims = new DefaultClaims();
        claims.setIssuer(username);
        claims.setSubject(username);
        claims.setIssuedAt(new Date(System.currentTimeMillis()));
        claims.setExpiration(new Date(System.currentTimeMillis() + EXPIRE_DURATION));
        return claims;
    }

    // payload refresh
    private Claims setPayloadRefresh(String username) {
        Claims claims = new DefaultClaims();
        claims.setIssuer(username);
        claims.setSubject(username);
        claims.setIssuedAt(new Date(System.currentTimeMillis()));
        claims.setExpiration(new Date(System.currentTimeMillis() + TOKEN_LIFETIME));
        return claims;
    }

    private String createToken(JwsHeader header, Claims payload) {
        System.out.println(header.hashCode());
        return Jwts.builder()
                .setHeader((Map<String, Object>)header) // header
                .setClaims(payload) // payload
                .signWith(getSignKey()).compact(); // signature (algo was set in header)
    }

    private Key getSignKey() {
        byte [] keyByte = Decoders.BASE64.decode(SECRET);
        return Keys.hmacShaKeyFor(keyByte);
    }

nhưng không hiểu sao sau khi gọi hàm generateToken() và generateRefreshToken(), giá trị token lại giống hết nhau khi chạy, còn khi debug thì lại khác. Mình đã set thuật toán ở header cho mỗi loại rồi.

Ai biết giúp mình với.

Không rõ bạn trẻ thử test khi generate token như thế nào rồi kêu token và refresh token giống nhau.
Tuy nhiên dựa vào code generate token và refresh token đã post lên thì 2 đoạn code này không có gì khác nhau về mặt nội dung cả thì việc cho ra kết quả giống nhau cũng không có gì là lạ. Điều này cũng giống như là gọi 2 lần vào 1 method gen token mà thôi
Còn lí do khi debug lại thấy khác nhau thì đó là do vấn đề liên quan đến thời gian (về cơ bản khi debug thì chương trình sẽ phải dừng lại nên tham số về thời gian sẽ khác nhau). System.milliseconds là quá chậm so với tốc độ xử lí của máy tính trong trường hợp này
Ps: ở đây không có lỗi gì gọi là dùng chung bộ nhớ cả

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?