目录
实现思路
相关技术的解析
编辑会话跟踪三个方案
JWT令牌技术
生成令牌
校验令牌
登录下发令牌
实现思路
通过登录成功的标记来检测,在每个接口前做一个标记判断是否登录,若没登录则返回错误信息,并使前端退出.但这样较为繁琐,因此我们可以通过一种统一拦截的技术来拦截所有请求.
相关技术的解析
会话跟踪的三个方案
1.访问cookie的值,在同一会话的不同请求之间共享数据
跨域:只要协议/IP地址/端口三个维度任何一个不同,就是跨域操作
2.session
3.现代普遍采用的令牌技术--JWT令牌
JWT令牌技术
一个令牌包含三个部分:头/有效载荷/签名:防止令牌被篡改
两个步骤:生成令牌-校验令牌
生成令牌
1.引入依赖
2.生成令牌
1.签名算法
2.自定义内容
3.令牌有效期
@Test
public void JwtTest()
{
Map<String, Object> claims = new HashMap<>();
claims.put("id", 1);
claims.put("name", "tom");
/*此处负载的内容是id和姓名*/
String jwt = Jwts.builder()
/*设置签名算法*/
.signWith(SignatureAlgorithm.HS256, "theresa")
/*自定义内容(负载)*/
.setClaims(claims)
/*设置有效期为一小时*/
.setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))
.compact();
}
校验令牌
报错的两种情况:过期/被篡改
.setSigningKey("theresa")填入和开始输入的一样,签名算法
.parseClaimsJws("")中填入要校验的令牌
public void ParseJwt(String jwt){
//许可验证
Claims claims = Jwts.parser()
.setSigningKey(signKey)//传递签名
.parseClaimsJws(jwt)//传递令牌
.getBody();//得到内容
System.out.println(claims);
}
登录下发令牌
@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.getUsername()); //包含当前登录的员工信息 String jwt = JwtUtils.JwtCreator(claims); return Result.success(jwt); } //登录失败,返回错误信息 return Result.error("用户名或密码错误"); } }