背景
现在的后端部署的服务都是基于分布式部署,因此可能存在如下情况,用户第一次的登陆请求打在了后端集群A上,用户的第二次下单请求可能打在了后端集群B上,那么集群B是不知道这个用户之前登陆过的,因此为了解决这个问题,提出了jwt登陆验证解决方案,可以实现分布式场景下的用户登陆验证。
jwt的核心是通过加密解密机制来实现的。
说明一下为什么要引入token?
因为当下互联网公司等后台都是分布式集群部署,如果用户一开始登陆请求打在了A服务器上,接下来访问请求如果打在了B服务器上,按理说应该不需要再次登陆就可以使用B服务器的服务了。那如何满足这个需求呢,可以在用户一开始登陆请求打在A服务器上的时候就通过A服务器根据用户的非敏感信息生成一个token返回给用户,后续用户再次访问都会携带token,这样不管后续访问打在哪个服务器上,都可以通过解密token来判断用户是否已经登陆过了。(核心在于后端服务器集群的每一个服务器节点都持有相同的加密解密密钥就可以!!!!)

引入依赖
<!-- JWT相关 --><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.7.0</version></dependency>
加密载体【与这个用户有关的非敏感信息】
@Datapublic class LoginUser {/*** 主键*/private Long id;/*** 名称*/private String name;/*** 头像*/@JsonProperty("head_img")private String headImg;/*** 邮箱*/private String mail;}
编写jwt工具类
/*** 用于jwt的加密和解密*/@Slf4jpublic class JWTUtil {/*** token 过期时间,正常是7天,方便测试我们改为70*/private static final long EXPIRE = 1000 * 60 * 60 * 24 * 7 * 10;/*** 加密的秘钥*/private static final String SECRET = "lianglin";/*** 令牌前缀*/private static final String TOKEN_PREFIX = "1024shop";/*** subject*/private static final String SUBJECT = "subject";/*** 根据用户信息,生成令牌** @param loginUser* @return*/public static String geneJsonWebToken(LoginUser loginUser) {if (loginUser == null) {throw new NullPointerException("loginUser对象为空");}String token = Jwts.builder().setSubject(SUBJECT)//payload.claim("head_img", loginUser.getHeadImg()).claim("id", loginUser.getId()).claim("name", loginUser.getName()).claim("mail", loginUser.getMail()).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + EXPIRE)).signWith(SignatureAlgorithm.HS256, SECRET).compact();token = TOKEN_PREFIX + token;return token;}/*** 校验token的方法** @param token* @return*/public static Claims checkJWT(String token) {try {final Claims claims = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token.replace(TOKEN_PREFIX, "")).getBody();return claims;} catch (Exception e) {log.info("jwt token解密失败");return null;}}}

文章转载自梁霖编程工具库,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




