springboot中会话技术方案cookie/session/jwt

会话跟踪 - 传统方案

  • cookie

    • http协议支持的技术
    • 缺点
      • 移动端app中不支持
      • 不安全,用户可以自己禁用cookie
      • cookie不能跨域
  • session

    • 存储在服务端,安全
    • 缺点
      • 服务端集群的场景下,无法使用session
      • cookie的缺点

会话跟踪 - 现代方案

  • jwt令牌
    • 优点
      • 支持pc,移动端
      • 解决集群环境下的认证问题
      • 解决服务器的存储压力
    • 缺点
      • 需要自己实现

JWT令牌的实现


代码实现

  • 测试代码
java 复制代码
@Test
public  void testGernateJWT(){
     Map<String, Object> claims = new HashMap<>();
     claims.put("id",1);
     claims.put("username","gaofeng");
     String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256, "gaofeng")
             .setClaims(claims).setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000)).compact();//自定义内容
     log.info("jwt:{}", jwt);
     this.testParseJWT(jwt);
 }


@Test
public  void testParseJWT(String jwt) {
    Claims claims = Jwts.parser().setSigningKey("gaofeng")
            .parseClaimsJws(jwt).getBody();
    log.info("id:{}", claims.get("id"));
    log.info("username:{}", claims.get("username"));
    log.info("expiration:{}", claims.getExpiration());
}
  • 封装jwt方法
java 复制代码
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class JwtUtils {
    private static  String signKey = "gaofeng";
    private static  Integer expire = 1000 * 60 * 30;

    public static String gernateJWT(Map<String,Object> claims){
        String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256, signKey)
                .setClaims(claims).setExpiration(new Date(System.currentTimeMillis() + expire)).compact();//自定义内容
        log.info("jwt:{}", jwt);
        return jwt;
    }

    public static Claims parseJWT(String jwt) {
        Claims claims = Jwts.parser().setSigningKey(signKey)
                .parseClaimsJws(jwt).getBody();
        log.info("id:{}", claims.get("id"));
        log.info("username:{}", claims.get("username"));
        log.info("expiration:{}", claims.getExpiration());
        return claims;
    }
}
  • controller代码
java 复制代码
@RestController
@Slf4j
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){
            //登录成功,生成jwt,并下发
            Map<String, Object> claims = new HashMap<>();
            claims.put("id", emp.getId());
            claims.put("username", emp.getUsername());
            claims.put("name", emp.getName());
            String jwt = JwtUtils.gernateJWT(claims);
            return Result.success(jwt);
        }
        return Result.error("登录失败,账户或密码错误");
    }
}

解析jwt网站:https://www.bejson.com/jwt/

页面登录后返回的结果

相关推荐
小羊没烦恼!16 小时前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里17 小时前
java中的继承和多态的区别
java
小羊没烦恼!17 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕17 小时前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码17 小时前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖17 小时前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时18 小时前
01-06-A-JVM排查实战详解
java·jvm
vipxieliang18 小时前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
ba_pi19 小时前
mysql 查询所有表名并授权
java
ProcessOn官方账号19 小时前
java函数式编程--入门基础
java·编程·函数式编程