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/

页面登录后返回的结果

相关推荐
希忘auto4 分钟前
详解MySQL安装
java·mysql
冰淇淋烤布蕾15 分钟前
EasyExcel使用
java·开发语言·excel
拾荒的小海螺21 分钟前
JAVA:探索 EasyExcel 的技术指南
java·开发语言
Jakarta EE38 分钟前
正确使用primefaces的process和update
java·primefaces·jakarta ee
马剑威(威哥爱编程)1 小时前
哇喔!20种单例模式的实现与变异总结
java·开发语言·单例模式
java—大象1 小时前
基于java+springboot+layui的流浪动物交流信息平台设计实现
java·开发语言·spring boot·layui·课程设计
ApiHug2 小时前
ApiSmart x Qwen2.5-Coder 开源旗舰编程模型媲美 GPT-4o, ApiSmart 实测!
人工智能·spring boot·spring·ai编程·apihug
魔道不误砍柴功2 小时前
探秘Spring Boot中的@Conditional注解
数据库·spring boot·oracle
杨哥带你写代码2 小时前
网上商城系统:Spring Boot框架的实现
java·spring boot·后端
camellias_2 小时前
SpringBoot(二十一)SpringBoot自定义CURL请求类
java·spring boot·后端