Spring boot 集成jjwt

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

时间线

package com.ys.vo;



public class TokenVo {
    private String token;//: "string",

    private long expTime;//: int,
    private long genTime;//: long

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    public long getExpTime() {
        return expTime;
    }

    public void setExpTime(long expTime) {
        this.expTime = expTime;
    }

    public long getGenTime() {
        return genTime;
    }

    public void setGenTime(long genTime) {
        this.genTime = genTime;
    }
}

yml文件

#jwt:
#  config:
#    key: ${random.uuid}
#    key: axju
#    expTime: 360000

jjwt

package com.ys.Utils;
/**
 * 使用Token密码进行加密
 */

import com.ys.utils.Constants;
import com.ys.vo.UserVo;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.Date;

@ConfigurationProperties("jwt.config")
public class JwtUtils {
    @Value("${jwt.config.key}")
    private String key;//秘钥
    @Value("${jwt.config.expTime}")
    private long expTime;//持续时间
    private long genTime;//: long

    public long getGenTime() {
        return genTime;
    }

    public void setGenTime(long genTime) {
        this.genTime = genTime;
    }

    public String createToken(当前用户obj userVo) {
        long genTime = System.currentTimeMillis();
        JwtBuilder builder = Jwts.builder().setId(当前用户id + "")
                .setSubject(当前用户名称)
                .setIssuedAt(new Date(genTime))
                .signWith(SignatureAlgorithm.HS256, key)
                .claim("currentUser", userVo);
        if (expTime > 0) {
            builder.setExpiration(new Date(genTime + expTime));
        }
        return builder.compact();
    }

    public Claims parseJWT(String jwtStr) {
        return Jwts.parser()
                .setSigningKey(key)//秘钥加密
                .parseClaimsJws(jwtStr)//载荷
                .getBody();//进行签证
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public long getExpTime() {
        return expTime;
    }

    public void setExpTime(long expTime) {
        this.expTime = expTime;
    }
}

接口登录

Object[] searchPhoneAndPasswd(String phone, String password) throws AuthException;

实现

@Resource
    private JwtUtils jwtUtils;

String jwtStr = jwtUtils.createToken(用户对象);
Claims claims = jwtUtils.parseJWT(jwtStr);

Object[] objects = new Object[2];
TokenVo tokenVo = new TokenVo();
tokenVo.setExpTime(claims.getExpiration().getTime());
tokenVo.setGenTime(claims.getIssuedAt().getTime());
tokenVo.setToken(jwtStr);
objects[0] = userVo;
objects[1] = tokenVo;

token

@Override
public UserVo loadCurrentUserByToken(String token) {
    Claims claims = jwtUtils.parseJWT(token);
    Map<String, Object> map = (Map<String, Object>) claims.get("currentUser");
    UserVo userVo = new UserVo();
    //map转对象
    map.forEach((k, v) -> {
        try {
            List<String> props = Arrays.asList("birthday", "createdTime", "updatedTime");
            if (props.contains(k) == false) {
                Ognl.setValue(k, userVo, v);
            } else {
                if (v != null) {
                    HashMap<String, Object> d1 = (HashMap<String, Object>) v;
                    LocalDateTime d2 = LocalDateTime.of((Integer) (d1.get("year")),
                            (Integer) (d1.get("monthValue")),
                            (Integer) (d1.get("dayOfMonth")),
                            (Integer) (d1.get("hour")),
                            (Integer) (d1.get("minute")));
                    Ognl.setValue(k, userVo, d2);
                }
            }
        } catch (OgnlException e) {
            e.printStackTrace();
        }
    });
    return userVo;
}
以下是Spring Boot集成JJWT的使用示例: 1. 首先,确保在pom.xml文件中添加所需的依赖项: ```xml <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.11.2</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.11.2</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.11.2</version> <scope>runtime</scope> </dependency> ``` 2. 创建一个JWT工具类,用于生成和解析JWT令牌: ```java import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; public class JwtUtils { private static final String SECRET_KEY = "your-secret-key"; private static final long EXPIRATION_TIME = 86400000; // 24小时 public static String generateToken(String username) { Date now = new Date(); Date expiration = new Date(now.getTime() + EXPIRATION_TIME); return Jwts.builder() .setSubject(username) .setIssuedAt(now) .setExpiration(expiration) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); } public static String getUsernameFromToken(String token) { Claims claims = Jwts.parser() .setSigningKey(SECRET_KEY) .parseClaimsJws(token) .getBody(); return claims.getSubject(); } public static boolean validateToken(String token) { try { Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token); return true; } catch (Exception e) { return false; } } } ``` 3. 在需要进行身份验证的地方,使用JWT工具类生成和验证令牌: ```java @RestController public class UserController { @PostMapping("/login") public String login(@RequestBody UserCredentials credentials) { // 验证用户名和密码 if (authenticate(credentials.getUsername(), credentials.getPassword())) { // 生成JWT令牌 String token = JwtUtils.generateToken(credentials.getUsername()); return token; } else { return "Authentication failed"; } } @GetMapping("/user") public String getUser(@RequestHeader("Authorization") String token) { // 验证令牌 if (JwtUtils.validateToken(token)) { String username = JwtUtils.getUsernameFromToken(token); return "Hello, " + username; } else { return "Invalid token"; } } private boolean authenticate(String username, String password) { // 进行身份验证逻辑 // 返回true表示验证通过,返回false表示验证失败 } } ``` 请注意,上述示例中的`your-secret-key`应替换为您自己的密钥。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值