目录
实现思路
相关技术的解析
编辑会话跟踪三个方案
JWT令牌技术
生成令牌
校验令牌
登录下发令牌
实现思路
通过登录成功的标记来检测,在每个接口前做一个标记判断是否登录,若没登录则返回错误信息,并使前端退出.但这样较为繁琐,因此我们可以通过一种统一拦截的技术来拦截所有请求.
相关技术的解析
会话跟踪的三个方案
1.访问cookie的值,在同一会话的不同请求之间共享数据
跨域:只要协议/IP地址/端口三个维度任何一个不同,就是跨域操作
2.session
3.现代普遍采用的令牌技术--JWT令牌
JWT令牌技术
一个令牌包含三个部分:头/有效载荷/签名:防止令牌被篡改
两个步骤:生成令牌-校验令牌
生成令牌
1.引入依赖
2.生成令牌
1.签名算法
2.自定义内容
3.令牌有效期
@Testpublic 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("用户名或密码错误");} }