【任务五JWT工具类的书写 _会话管理 】 | IT修真院·坑乎
问题已收录 任务五JWT工具类的书写
我也踩过这个坑( 2 )
已统计您的踩坑,无需重复点击
回答(3)
会话管理
详细描述
错误截图
源码
编辑于2024-05-03
  • [郑州|结业弟子]JAVA-何爽
    0

    1.首先你用的是jjwt并不是jwt。

    2.jjwt的依赖包:

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

    3.我的jwt工具类:

    package com.task5.until;

    import io.jsonwebtoken.*;
    import org.springframework.beans.factory.annotation.Autowired;

    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;

    public class JWT {
    private String key;
       @Autowired
       private DES des;

       public void setKey(String key) {
    this.key = key;
       }
    //生成jwt
       public String generateToken(String username, long expiry) {
    io.jsonwebtoken.SignatureAlgorithm signatureAlgorithm = io.jsonwebtoken.SignatureAlgorithm.HS256; //指定签名的时候使用的签名算法,也就是header那部分,jjwt已经将这部分内容封装好了。
           //生成jwt的时间
           Long now = System.currentTimeMillis();
           Date generateTime = new Date(now);
           //创建payload的私有声明(根据特定的业务需要添加,如果要拿这个做验证,一般是需要和jwt的接收方提前沟通好验证方式的)
           Map<String, Object> claims = new HashMap<>();
           claims.put("username", des.encrypt(username));
           claims.put("generateTime", des.encrypt(generateTime.toString()));
            JwtBuilder jwtBuilder = Jwts.builder()//这里其实就是new一个JwtBuilder,设置jwt的body
                   .setClaims(claims)//如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的
                   .setIssuedAt(generateTime)//签发时间
                   .signWith(signatureAlgorithm, key);
           if (expiry > 0) {
    Date expiryTime = new Date(now + expiry);//过期时间
               jwtBuilder.setExpiration(expiryTime);
           }
    return jwtBuilder.compact();
       }

    public Map<String, Object> parseToken(String token) {
    Map<String, Object> result = new HashMap<>();
           if (token != null) {
    // 解析token
               try {
    Map<String, Object> body = Jwts.parser()
    .setSigningKey(key)
    .parseClaimsJws(token)
    .getBody();
                   String username = (String) body.get("username");
                   String generateTime = (String) body.get("generateTime");

                   if (username == null || username.isEmpty()) {
    result.put("ERR_MSG", "您还没有登录,请登录:");
                       return result;
                   }
    result.put("username", des.decrypt(username));
                   result.put("generateTime", des.decrypt(generateTime));
                   return result;
               } catch (SignatureException | MalformedJwtException e) {
    // jwt 解析错误
                   result.put("ERR_MSG", "系统错误,请尝试重新登录:");
                   return result;
               } catch (ExpiredJwtException e) {
    // jwt 已经过期,在设置jwt的时候如果设置了过期时间,这里会自动判断jwt是否已经过期,如果过期则会抛出这个异常,我们可以抓住这个异常并作相关处理。
                   result.put("ERR_MSG", "登录信息已过期,请登录:");
                   return result;
               }
    } else {
    result.put("ERR_MSG", "没有您的身份信息,请登录:");
               return result;
           }
    }
    }

    4.尝试下放进你的项目中,看下可以使用不,后续还有问题可以私聊我。

    编辑于2018-09-28
  • [上海|荣耀师兄]JAVA-朱明星
    0

    我用的是这一堆

    <!--Jwt-->

        <dependency>

          <groupId>io.jsonwebtoken</groupId>

          <artifactId>jjwt-api</artifactId>

          <version>0.10.5</version>

        </dependency>

        <dependency>

          <groupId>io.jsonwebtoken</groupId>

          <artifactId>jjwt-impl</artifactId>

          <version>0.10.5</version>

          <scope>runtime</scope>

        </dependency>

        <dependency>

          <groupId>io.jsonwebtoken</groupId>

          <artifactId>jjwt-jackson</artifactId>

          <version>0.10.5</version>

          <scope>runtime</scope>

        </dependency>




    /**

         * jwt协议的加密解密,组要设置加密算法,加密密钥,过期时间

         * 加密时,将username加进去

         * 解密时,需要进行过期校验、密钥校验

         */


        //签名密钥(高度保密)

        private static final String KEY = "HelloWorld!";

        private static final int calendarField = Calendar.DATE;

        private static final int calendarInterval = 10;


        public static String createJWT(String username, long loginTime) throws UnsupportedEncodingException {

            Map<String,Object> map = new HashMap<>();

            map.put("alg","HS256");

            map.put("typ","JWT");


            Date time = new Date();

            Calendar currentTime = Calendar.getInstance();

            currentTime.add(calendarField, calendarInterval);

            Date expires = currentTime.getTime();

            String token = JWT.create()

                    .withHeader(map)

                    .withIssuer("issuer")

                    .withSubject("subject")

                    .withClaim("username",username)

                    .withClaim("loginTime", String.valueOf(loginTime))

                    .withExpiresAt(expires)

                    .sign(Algorithm.HMAC256(KEY));

            return token;

        }


        /**

         * 校验token有效性

         * @param token

         * @return

         */

        public static Map<String, Claim> verifyToken(String token) throws UnsupportedEncodingException {

            DecodedJWT jwt = null;

            try {

                JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(KEY)).build();

                jwt = jwtVerifier.verify(token);

            } catch (Exception e){

                e.printStackTrace();

            }

            return jwt.getClaims();

        }


    编辑于2018-11-24
  • [上海|结业弟子]JAVA-胡畔
    0
    <!--token-->
    <!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt -->
    <dependency>
       <groupId>io.jsonwebtoken</groupId>
       <artifactId>jjwt</artifactId>
       <version>0.9.0</version>
    </dependency>


    导这个包,claims是jjwt封装好的一个创建token的方法

    编辑于2019-08-02