分布式微服务 jwt实现单点登录

分布式微服务 jwt实现单点登录

Step 1 -> 添加依赖

 <!--    jwt 单点登录-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.0</version>
        </dependency>

Step 2 -> 添加工具类

package com.guanqi.util;

import com.guanqi.entity.User;
import io.jsonwebtoken.*;

import java.util.Date;

public class JwtUtil {
    /**
     * JWT加密密钥
     */
    private static final String SECURITY_KEY = "asfasdfasdcl-oisdfzx=zxc";

    //过期时间
    private static final Long TTL = 7 * 24 * 60 *6*1000L;

    /**
     * 生成JwtToken
     * @return
     */
    public static String createJwtToken(User user){
        JwtBuilder jwtBuilder = Jwts.builder()
                .setId(user.getId() + "")       //设置tokenID
                .setSubject(user.getUsername())   //设置主题   jwt面向的用户
                .setIssuedAt(new Date())     //签发时间
                .setExpiration(new Date(System.currentTimeMillis() + TTL))//过期时间
                .claim("id", user.getId()) //自定义属性
                .claim("username", user.getUsername())
                .claim("nickname", user.getNickname())
          					//以上都是 载荷
                .signWith(SignatureAlgorithm.HS256,SECURITY_KEY);//签名,进行密钥加密    
				// 这个是签证

        return jwtBuilder.compact();
    }


    /**
     *
     * @param token
     * @return
     */
    public static User parseJwtToken(String token){
        User user = null;

        try {
            Claims  body =  (Claims) Jwts.parser().setSigningKey(SECURITY_KEY).parse(token).getBody();
            Integer id = (Integer) body.get("id");
            String username = (String) body.get("username");
            String nickname = (String) body.get("nickname");

            user = new User().setId(id).setUsername(username).setNickname(nickname);
        } catch (ExpiredJwtException e) {
            e.printStackTrace();
        } catch (MalformedJwtException e) {
            e.printStackTrace();
        } catch (SignatureException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
        // System.out.println(id + "-" +username +"-" +nickname);

//        String id1 = body.getId();
//        String subject = body.getSubject();
//        System.out.println(id1 +"-"+subject);
        return user;
    }


}

Step 3 -> main 测试

 public static void main(String[] args) {
        User user = new User().setId(1).setUsername("testadmin").setNickname("这是个昵称");
		
   //注:   密钥是调用者提供的,服务端生成
   
   
   
   		//创建令牌
        String jwtToken = createJwtToken(user);
        System.out.println(jwtToken);

		//解析令牌
        User user1 = parseJwtToken(jwtToken);
        System.out.println(user1);

    }

//运行结果:
eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxIiwic3ViIjoidGVzdGFkbWluIiwiaWF0IjoxNTkwODk1MDk1LCJleHAiOjE1OTA5NTU1NzUsImlkIjoxLCJ1c2VybmFtZSI6InRlc3RhZG1pbiIsIm5pY2tuYW1lIjoi6L-Z5piv5Liq5pi156ewIn0.ZX5UM7Ti4uH6RNcO2FGXkzBTsLxj2bQ1zNPo7rklLsc

User(id=1, username=testadmin, password=null, nickname=这是个昵称, email=null, createTime=Sun May 31 11:18:16 CST 2020, status=0)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值