美文网首页
springboot集成jwt和ssm(springmvc)集成

springboot集成jwt和ssm(springmvc)集成

作者: 创奇 | 来源:发表于2020-03-17 10:27 被阅读0次

    JWT官网: https://jwt.io/
    JWT(Java版)的github地址:https://github.com/jwtk/jjwt

    什么是JWT

    Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).定义了一种简洁的,自包含的方法用于通信双方之间以JSON对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名

    注意redis中存储的jwt过期时间要和jwt工具类生成的jwt过期时间一致

    ssm版本的

    <dependency>
        <groupId>com.auth0</groupId>
        <artifactId>java-jwt</artifactId>
        <version>3.3.0</version>
    </dependency>
    
    
    package com.tale.subject.util;
    
    import java.io.UnsupportedEncodingException;
    import java.util.*;
    import com.auth0.jwt.JWT;
    import com.auth0.jwt.JWTVerifier;
    import com.auth0.jwt.algorithms.Algorithm;
    import com.auth0.jwt.interfaces.Claim;
    import com.auth0.jwt.interfaces.DecodedJWT;
    
    public class JwtUtil {
    
        private static String SECRET = "token_666";  // 秘钥(公钥)
    
        /**
         * 生成token
         * @param id
         * @param username
         * @param type
         * @return
         * @expireTime
         */
        public static String createToken(String id, String username, String type, Date expireTime){
            // 签发时间
            Date iatDate = new Date();
    
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("alg", "HS256");
            map.put("typ", "JWT");
            String token = null; // 加密
            try {
                System.out.println("token >>id" + id);
                token = JWT.create()
                        .withHeader(map)
                        .withClaim("username", username)
                        .withClaim("id", id)
                                        .withClaim("type", type)
                        .withExpiresAt(experiesDate)  // 设置过期的日期
                        .withIssuedAt(iatDate)        // 签发时间
                        .sign(Algorithm.HMAC256(SECRET));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return token;
        }
    
        /**
         * 解密
         * @param token
         * @return
         * @throws Exception
         */
        public static Map<String, Claim> verifyToken(String token) {
            JWTVerifier verifier = null;
            try {
                verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            DecodedJWT jwt = null;
    
            jwt = verifier.verify(token);  // 核实token
    
            return jwt.getClaims();  // 这里解密jwt得到的是一个map
        }
    
    
    }
    
    

    springboot版本:

     <dependency>
          <groupId>io.jsonwebtoken</groupId>
          <artifactId>jjwt</artifactId>
          <version>0.9.0</version>
    </dependency>
    
    package com.gxuwz.spring.demo.util;
    
    import io.jsonwebtoken.Claims;
    import io.jsonwebtoken.Jwts;
    import io.jsonwebtoken.SignatureAlgorithm;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * jwt工具,用于生成jwt和解密jwt
     * jwt主要部分:1.claims(主要用于封装用户信息,及角色)
     * TODO 未处理角色,即对方知道路径但该角色没有权限应该拦截请求
     * 2.加密算法和秘钥
     * 3.过期时间
     */
    public class JWTUtil {
    
        private static final String SECRET = "tale_secret";
    
    
        /**
         * 生成jwt
         * @param id 作为唯一标识
         * @param userName 用户名
         * @param role 角色
         * @expireTime 过期时间
         */
        public static String builderJWT(String id, String userName, String role, Date expireTime){
            Map<String, Object> jwtInfo = new HashMap<>();
    
            jwtInfo.put("id", id);
            jwtInfo.put("userName", userName);
            jwtInfo.put("role", role);
    
            String jwt = Jwts.builder().setClaims(jwtInfo)
                    .setExpiration(expireTime)
                    .signWith(SignatureAlgorithm.HS256, SECRET) // 加密算法及秘钥
                    .compact();
    
            return jwt;
    
        }
    
    
        /**
         * 解密jwt
         * @param jwt
         * @return
         */
        public static Claims parseJWT(String jwt){
            Claims claim = Jwts.parser().setSigningKey(SECRET)
                    .parseClaimsJwt(jwt).getBody();
    
            return claim;
    
        }
    
    }
    
    
    

    redis方法

    /**
         * 存储jwt
         * @param key
         * @param value
         * @param expireTime
         */
        public boolean setToken(String key, Object value, long expireTime) {
            try {
                redisTemplate.opsForValue().set(key, value, expireTime, TimeUnit.SECONDS);
    
            }catch (Exception e){
                e.printStackTrace();
                return false;
            }
            
            return true;
        }
    

    在登录时生成jwt并存储jwt到redis,登录方法这里就不贴了

    注意redis中存储的jwt过期时间要和生成的jwt过期时间一致

    jwt拦截器验证

    相关文章

      网友评论

          本文标题:springboot集成jwt和ssm(springmvc)集成

          本文链接:https://www.haomeiwen.com/subject/hxmzehtx.html