目录
实现思路
相关技术的解析
编辑会话跟踪三个方案
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("用户名或密码错误");
}
}



















