Java常用包系列--JWT
发布日期:2021-05-10 13:43:52 浏览次数:11 分类:精选文章

本文共 7506 字,大约阅读时间需要 25 分钟。

JWT���������������������

JWT������

JWT���JSON Web Token���������������������������������������������������������������������������������������������������������RFC 7519���������������������������������Token���������������������������������Token������������������������������������������������������������������

JWT������

JWT���������������������Header���������������Payload���������������Signature���������������

  • Header

    contiene���������������

    • alg���������������������������������������������HS256���
    • typ���������Token���������������������JWT���
  • Payload

    ������������������������������������������������������������������

    • ���������������iss������������������sub���������������aud������������������exp���������������������iat���������������������jti���Token������������������
    • ���������������������������������������������
    • ���������������������������������������������������
  • Signature

    ���������������Header���Payload���������������������������������������������������

    • base64UrlEncode Header + "." + base64UrlEncode Payload������������������������������
    • ���Header���Payload���Signature������������������Token������������.`������������
  • JWT���������

    ���������

    • ���������������������������������������Token������������������
    • ���������������������������������������������������Session���������
    • ������������������Token���JSON������������������������������������

    ���������

    • ������������������Base64���������Payload���������������������������������������������������
    • ������������Token������������������Token������������������������
    • ������������������Token���������Session���������������������������Token���

    Cookie+Session���JWT������

    ��������� Cookie+Session JWT
    ������������ ���������������Session������������������Session ID��� ���������������Token������������������Token���
    ��������� ��������������������������������������������������� Token���������������������������
    ������������ ������Redis������������������Session��������� Token���������������������������������

    JWT������������

    1. ������������

    ������ JWT���������������com.auth0:java-jwt���io.jsonwebtoken:jjwt���������������������������������

    implementation 'com.auth0:java-jwt:3.10.3'
    // ������
    implementation 'io.jsonwebtoken:jjwt:0.9.1'

    2. ������������

    ���application.yml��������� JWT ���������

    server:
    port: 8080
    spring:
    application:
    name: springboot-jwt
    config:
    jwt:
    secret: abc123
    expire: 300000

    3. ������JWT���������

    ������IJwtUtil������������������������������������

    Java-JWT���������

    import com.auth0.jwt.JWT;
    import com.auth0.jwt.JWTVerifier;
    import com.auth0.jwt.algorithms.Algorithm;
    import com.auth0.jwt.exceptions.JWTDecodeException;
    import com.auth0.jwt.exceptions.JWTVerificationException;
    import com.example.util.IJwtUtil;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    import java.util.Date;
    @Component("javaJwtUtil")
    public class JavaJwtUtil implements IJwtUtil {
    @Value("${config.jwt.expire}")
    private long expireTime;
    @Value("${config.jwt.secret}")
    private String secretKey;
    @Override
    public String createToken(String userId) {
    try {
    Date expiration = new Date(System.currentTimeMillis() + expireTime);
    Algorithm algorithm = Algorithm.HMAC256(secretKey);
    return JWT.create()
    .withExpiresAt(expiration)
    .withAudience(userId)
    .sign(algorithm);
    } catch (Exception e) {
    return null;
    }
    }
    // ������������������...
    }

    JJWT���������

    import io.jsonwebtoken.Claims;
    import io.jsonwebtoken.Jwts;
    import io.jsonwebtoken.SignatureAlgorithm;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    @Component("jJwtUtil")
    public class JJwtUtil implements IJwtUtil {
    @Value("${config.jwt.expire}")
    private long expireTime;
    @Value("${config.jwt.secret}")
    private String secretKey;
    @Override
    public String createToken(String userId) {
    Date expiration = new Date();
    return Jwts.builder()
    .setExpirationDate(expiration.getTime() + expireTime)
    .setSubject(userId)
    .signWith(SignatureAlgorithm.HS256, secretKey)
    .compact();
    }
    // ������������...
    }

    4. ���������������

    ���������������������������Token������������

    @Slf4j
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.web.servlet.HandlerInterceptor;
    @Component
    public class JwtInterceptor implements HandlerInterceptor {
    @Autowired
    @Qualifier("jJwtUtil")
    private IJwtUtil jwtUtil;
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    // ���������������Token���������������
    if (!(handler instanceof HandlerMethod)) {
    return true;
    }
    String uri = request.getRequestURI();
    if (isWhiteUrl(uri)) {
    return true;
    }
    // ���Header������������������Token
    String token = request.getHeader("token");
    if (StringUtils.isEmpty(token)) {
    token = request.getParameter("token");
    if (StringUtils.isEmpty(token)) {
    throw new RuntimeException("������Token");
    }
    }
    // ������Token
    if (!jwtUtil.verifyToken(token)) {
    log.error("Token������");
    return false;
    }
    // ������������������
    String userId = jwtUtil.getUserByToken(token);
    String userName = jwtUtil.getUserNameByToken(token);
    log.debug("������ID: {}, ���������: {}", userId, userName);
    return true;
    }
    private List
    getWhiteList() {
    return new Fixes({
    "/auth/login",
    "/error"
    });
    }
    }

    5. ���������������

    ������Token������������

    @RestController
    @RequestMapping("/auth")
    public class AuthController {
    @Autowired
    @Qualifier("jJwtUtil")
    private IJwtUtil jwtUtil;
    @RequestMapping("/login")
    public String login() {
    // ������������������������ID���������Token
    String userId = 5L + "";
    String token = jwtUtil.createToken(userId);
    log.info("������Token: {}", token);
    return token;
    }
    @RequestMapping("/info")
    public String info() {
    return "������������";
    }
    }

    ���������������

    Token���������������������

  • ������������������������������������������������������JWT Token���
  • Token������������Token���HTTP Header���������������������
  • ���������������������������������������Token������������������������
  • ���������������������������Token������������ID���������������
  • ������������

  • ������Token������:

    • Header: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpVA...
    • Payload: { "sub": "123", "name": "John Doe", "iat": "..." }
    • Signature: base64UrlEncode(Header + "." + Payload)������������������������
  • ������Token������:

    • ������Token������������������������������������500���������
    • ������������������Token������������������������������
  • ������������������

  • Token������:

    • Real-time������Token������������������������Token���
    • Redis������Token���������������������������������������������������������
  • ���������������:

    • ������HTTPS������Token���
    • ������Token���������������������������������������������
  • ���������������������������������������������������JWT���������������������������������������������������������

    上一篇:build系列--综述
    下一篇:Spring IOC--注入与装配

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年04月23日 15时39分35秒