一、理论
1.配置pom.xml
<!-- JWT令牌--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>
2.加密方式
说明:官网JSON Web Tokens - jwt.io
3. 测试类
说明:使用Jwts.builder()方法创建一个JWT实例,设置签名算法为HS256,自定义内容(载荷)为一个包含id和name属性的Map对象,设置有效期为一个小时(3600秒),最后通过compact()方法生成JWT字符串并输出。
// 测试jwt生成@Testpublic void testGenJWT(){Map<String, Object> claims=new HashMap<>();claims.put("id",1);claims.put("name","tom");String jwt=Jwts.builder().signWith(SignatureAlgorithm.HS256,"forever") //设置签名算法.setClaims(claims) //自定义内容(载荷).setExpiration(new Date(System.currentTimeMillis()+3600*1000)) //设置有效期为一个小时.compact();System.out.println(jwt);}
}
4. 官网解码
5.解码方法
说明:使用Jwts.parser()方法创建一个JWT解析器实例,指定签名秘钥为"forever",然后调用parseClaimsJws()方法解析JWT字符串,最后获取解析出的Claims对象并输出。
//JWT解析@Testpublic void testParseJwt() {Claims claims = Jwts.parser().setSigningKey("forever") //指定签名秘钥.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTY5NTE5MzIxM30.EZ3aIpgt3-FRu0BI3F2ZjVm2yLvF7wHQmFV2KhC5nIc") //解析令牌.getBody();System.out.println(claims);}
}
二、实战
1. JwtUtils类
说明:书写JwtUtils类
package com.itheima.controller.utils;import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;public class JwtUtils {private static String signKey = "forever";private static Long expire = 43200000L;/*** 生成JWT令牌* @param claims JWT第二部分负载 payload 中存储的内容* @return*/public static String generateJwt(Map<String, Object> claims){String jwt = Jwts.builder().addClaims(claims).signWith(SignatureAlgorithm.HS256, signKey).setExpiration(new Date(System.currentTimeMillis() + expire)).compact();return jwt;}/*** 解析JWT令牌* @param jwt JWT令牌* @return JWT第二部分负载 payload 中存储的内容*/public static Claims parseJWT(String jwt){Claims claims = Jwts.parser().setSigningKey(signKey).parseClaimsJws(jwt).getBody();return claims;}
}
2.LoginController
说明:登录控制类
package com.itheima.controller;import com.itheima.controller.utils.JwtUtils;
import com.itheima.pojo.Emp;
import com.itheima.pojo.Result;
import com.itheima.service.EmpService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;@Slf4j
@RestControllerpublic class LoginController {@Autowiredprivate EmpService empService;@PostMapping("/login")public Result login(@RequestBody Emp emp) {log.info("员工登录:{}", emp);Emp e = empService.login(emp);
// 如果登录成功,生成令牌,下发令牌if (e != null) {Map<String, Object> claims = new HashMap<>();claims.put("id", e.getId());claims.put("name", e.getName());claims.put("username", e.getName());String jwt = JwtUtils.generateJwt(claims); //包含员工登录的信息return Result.success(jwt);}
// 登录失败,返回错误信息return Result.error("用户名或者密码错误");}
}