JWT(json web token)简单入门,Java实现
有没有一种不需要自己存放 Session 信息就能实现身份验证的方式呢?使用 Token 即可!JWT (JSON Web Token) 就是这种方式的实现,通过这种方式服务器端就不需要保存 Session 数据了,只用在客户端保存服务端返回给客户的 Token 就可以了,扩展性得到提升。
在介绍实现之前,推荐阅读大神阮一峰的一篇博客,博客中有对json web token 理论基础完整且简单明了的阐述。建议在学习jwt具体实现前先看看这篇博客(http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html)
jwt的官方网站为(jwt.io),进入官网,点击导航栏中的Libraries可以查看各种语言对jwt的封装库,包括java, javascript, python, go等语言。我选择的java库为(https://github.com/jwtk/jjwt),库的具体使用可以查看它的官方页面,这里做个入门介绍。
首先引入maven坐标:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred -->
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
在实际项目中可以封装一个JWTUtil工具类,定义token生成和token验证的方法:
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import java.security.Key;
import java.util.Date;
public class JWTUtil {
private static Key key= Keys.secretKeyFor(SignatureAlgorithm.HS256);//定义加密算法
public static String getToken(String uid)//接收user id生成token
{
String token=Jwts.builder()
.setSubject(uid)//设置uid
.signWith(key)//设置加密算法
.setExpiration(new Date(System.currentTimeMillis()+15*60*1000))//设置过期时间15分钟
.compact();
return token;
}
public static String checkToken(String token)//接收传入的token
{
try
{
String uid=Jwts.parserBuilder()
.setSigningKey(key)//设置解密算法
.build()
.parseClaimsJws(token)//解析token
.getBody()
.getSubject();//获取设置的uid
return uid;
}catch (ExpiredJwtException e)//超时异常
{
return "expired";
}
catch (JwtException e)//签名校验异常
{
return "invalid";
}
catch (Exception e)
{
return "invalid";
}
}
}
上面的代码只是对校验的简单实现,在实际的网站开发中可以将生成的token放入http的header中返回给前端,前端将得到的token保存在本地,在下次请求时在header中加上token。
上面的代码中并没有对token过期时间的刷新,实际开发中可以在设置一个servlet的过滤器来对token进行过期时间刷新。
上一篇: Java web入门——Servlet
下一篇: 12年老站长的五年网赚经验分享与感慨