目的
一般系统都有登陆和验证用户是否登陆的需求,现在的项目好多都是前后端分离的,一般的session也不适合于多台机器同时提供服务的场景,所以可以使用jwt生成token,然后使用token来鉴定该用户是否登陆/登陆是否过期等。
优缺点
优点
- 生成token简单,可以携带简单信息
- 验证方便,不需要数据库等二次验证
缺点
- 一旦签发就不受服务端控制
- 想要更新必须生成一个新的token
代码
pom引入
有两种用的比较多的jwt,大家自选一下,以下两种选用一种即可,我用的是java-jwt
<dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.18.2</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency>
生成jwt
public String generateNewJwt(User user) { Calendar nowTime = Calendar.getInstance(); nowTime.add(Calendar.MINUTE,30); Date expiresDate = nowTime.getTime(); return JWT.create().withAudience(user.getId().toString()) //签发对象 .withIssuedAt(new Date()) //发行时间 .withExpiresAt(expiresDate) //有效时间 .withClaim("mobile", user.getMobile()) //claim,携带信息,可自由设定内容和数量 .sign(Algorithm.HMAC256(SecretConstant.BASE64SECRET)); //加密 }
校验jwt
只要不抛出异常,则认为jwt还未过期
DecodedJWT jwt = null; try { JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SecretConstant.BASE64SECRET)).build(); jwt = verifier.verify(token); } catch (Exception e) { //效验失败 }
刷新jwt
其实就是生成一个新的token
其他用法
也有把token当成session用的,比如生成一个不过期的token,然后存到redis,使用redis做过期等的校验,这种方式还有一个好处就是,当token刷新,之前的token可以很方便的失效,因为只有在redis中存在的token才算是有效的token
总结
jwt只是所有解决方案中的一种,在清楚优缺点的情况下,选择适合当前项目的鉴权方式就可以。