jwt的全称是JSON Web Token;JSON Web
Token是一个开源标准(rfc7519),是一个轻量,携带着用户信息的json
Object对象,安全的进行服务器端与客户端交互;这个对象能够校验、信任,由于它由数字组成;
轻量:由于轻量,因此能够更好地放在httpheader里面,在服务器与客户端之间快速交互
携带用户信息:将用户的重要信息:userId,userName等放在jwt当中,不用再次从数据库当中获取html
须要认证:用户根据username、password登陆后,使用jwt返回一个token给客户端,客户端在请求的时候将token放在http
header当中给服务器端,服务器端校验token的合法性,而后处理请求的responsejava
用户信息被改变:web
由header、payload、sinature三部分组成,最终以xxx.yyy.zzz的形式拼接算法
header由两部分组成:数据库
payload里面存放着用户的信息,能够使用claims进行复合拼装,claims由已定义、public、private三部分组成json
payload当中的数据均可以由用户自行设置安全
签名,根据header、payload和一个用户设置的密码(secret),生成一个签名,最后将header,payload,sinature拼接成xxx.yyy.zzz形式服务器
pom.xml里面引入jwtui
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.7.0</version> </dependency>
public static void main(String[] args) { String secret = "password"; String userId = "zhangsan"; String userName = "张三"; // 输出的jwt:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ6aGFuZ3NhbiIsInVzZXJOYW1lIjoi5byg5LiJIn0.024kCUw4nodiXEdeOWtjWFn8u2eoh-DdfmLiXYgZs9g String jwt = Jwts.builder().setSubject(userId).signWith(SignatureAlgorithm.HS256, secret) .claim("userName", userName).compact(); System.out.println(jwt); // 客户端将Jwt传递给服务器,服务器根据secret进行解密,能够对jwt进行校验,取数据 Jws<Claims> claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(jwt); //header={alg=HS256},body={sub=zhangsan, userName=张三},signature=024kCUw4nodiXEdeOWtjWFn8u2eoh-DdfmLiXYgZs9g System.out.println(claims); }
由上面能够看出claims里面存放的数据由header、body、signature三部分组成加密