- <!-- JWT令牌-->
- <dependency>
- <groupId>io.jsonwebtoken</groupId>
- <artifactId>jjwt</artifactId>
- <version>0.9.1</version>
- </dependency>
说明:使用Jwts.builder()方法创建一个JWT实例,设置签名算法为HS256,自定义内容(载荷)为一个包含id和name属性的Map对象,设置有效期为一个小时(3600秒),最后通过compact()方法生成JWT字符串并输出。
- // 测试jwt生成
- @Test
- public void testGenJWT(){
-
- Map
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);
- }
- }
说明:使用Jwts.parser()方法创建一个JWT解析器实例,指定签名秘钥为"forever",然后调用parseClaimsJws()方法解析JWT字符串,最后获取解析出的Claims对象并输出。
- //JWT解析
- @Test
- public void testParseJwt() {
- Claims claims = Jwts.parser()
- .setSigningKey("forever") //指定签名秘钥
- .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTY5NTE5MzIxM30.EZ3aIpgt3-FRu0BI3F2ZjVm2yLvF7wHQmFV2KhC5nIc") //解析令牌
- .getBody();
- System.out.println(claims);
- }
- }
说明:书写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
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;
- }
- }
说明:登录控制类
- 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
- @RestController
-
- public class LoginController {
- @Autowired
- private EmpService empService;
-
- @PostMapping("/login")
- public Result login(@RequestBody Emp emp) {
- log.info("员工登录:{}", emp);
- Emp e = empService.login(emp);
- // 如果登录成功,生成令牌,下发令牌
- if (e != null) {
- Map
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("用户名或者密码错误");
- }
- }