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/

页面登录后返回的结果

相关推荐
majingming1231 小时前
FUNCTION
java·前端·javascript
zopple1 小时前
常见的 Spring 项目目录结构
java·后端·spring
xuxie993 小时前
N11 ARM-irq
java·开发语言
cjy0001113 小时前
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
java·spring boot·后端
wefly20174 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
zhenxin01224 小时前
Spring Boot实现定时任务
java
小江的记录本4 小时前
【事务】Spring Framework核心——事务管理:ACID特性、隔离级别、传播行为、@Transactional底层原理、失效场景
java·数据库·分布式·后端·sql·spring·面试
sheji34164 小时前
【开题答辩全过程】以 基于springboot的校园失物招领系统为例,包含答辩的问题和答案
java·spring boot·后端
寂静or沉默4 小时前
2026最新Java岗位从P5-P7的成长面试进阶资源分享!
java·开发语言·面试
卓怡学长4 小时前
m289在线交友系统
java·spring·tomcat·maven·intellij-idea·hibernate