- 会话指的是浏览器与服务器之间的一次连接,我们称之为一次会话。
- 在用户打开浏览器第一个访问服务器的时候,这个会话就建立了,只要有任何一方断开连接,此时会话就结束了。再一次会话中是可以包含多次请求和相应。
- 那什么是会话跟踪呢?
- 会话跟踪是一种维护浏览器状态的方法,服务器需要识别请求是否来自同一浏览器,一遍在同一次会话的多次请求间共享数据。而识别多次请求是否来自同一浏览器的过程,我们称之为会话跟踪。
- 什么是令牌技术?
- 令牌呢就是一个用户身份的表示,看似很高大上非常神秘,其实本质就是一个字符串。
- 通过令牌技术跟踪会话,我们就可以在浏览器发起请求。登录接口成功生成令牌,在响应数据的时候就直接将令牌响应给前段。
- 前段接受到令牌就需要存储起来
- 后续每次请求都要将令牌携带到服务端,来校验令牌的有效性。令牌有效证明已经执行了登录操作,令牌无效证明并未执行登录操作。
- 优点:
- 支持PC端、移动端
- 解决集群环境下的认证问题
- 减轻服务器的存储压力(无需再服务器端存储)
- 缺点:
- 需要自己实现(包括令牌的生成、传递、校验)
- JWT介绍(JSON Web Token)
- 就是一个简单的字符串,可以在请求参数或者是请求头当中直接传递。
- 自包含:JWT令牌,看似是一个随机的字符串,但是我们是可以根据自身的需求唉JWT令牌中存储自定义的数据类容。
- JWT组成
文章来源地址https://www.toymoban.com/news/detail-408545.html
- Header(头),记录令牌类型、签名算法等
- PayLoad(有效载荷),携带一些自定义信息,默认信息等
- Signature(签名),防止Token被篡改,确保含安全性
- 介绍完这么多正题来啦,要想使用JWT令牌,首先引入JWT的依赖:
-
<!-- JWT依赖--> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency>
-
- 添加Jwt工具类
-
public class JwtUtils { private static String signKey = "itheima";//签名密钥 private static Long expire = 43200000L; //有效时间 /** * 生成JWT令牌 * @param claims JWT第二部分负载 payload 中存储的内容 * @return */ public static String generateJwt(Map<String, Object> claims){ String jwt = Jwts.builder() .addClaims(claims)//自定义信息(有效载荷) .signWith(SignatureAlgorithm.HS256, signKey)//签名算法(头部) .setExpiration(new Date(System.currentTimeMillis() + expire))//过期时间 .compact(); return jwt; } /** * 解析JWT令牌 * @param jwt JWT令牌 * @return JWT第二部分负载 payload 中存储的内容 */ public static Claims parseJWT(String jwt){ Claims claims = Jwts.parser() .setSigningKey(signKey)//指定签名密钥 .parseClaimsJws(jwt)//指定令牌Token .getBody(); return claims; } }
-
- 引用完依赖后,调用工具类中提供的API来完成JWT令牌的生成和校验
-
@RestController @Slf4j public class LoginController { //依赖业务层对象 @Autowired private EmpService empService; @PostMapping("/login") public Result login(@RequestBody Emp emp) { //调用业务层:登录功能 Emp loginEmp = empService.login(emp); //判断:登录用户是否存在 if(loginEmp !=null ){ //自定义信息 Map<String , Object> claims = new HashMap<>(); claims.put("id", loginEmp.getId()); claims.put("username",loginEmp.getUsername()); claims.put("name",loginEmp.getName()); //使用JWT工具类,生成身份令牌 String token = JwtUtils.generateJwt(claims); return Result.success(token); } return Result.error("用户名或密码错误"); } }
-
文章来源:https://www.toymoban.com/news/detail-408545.html
到了这里,关于会话跟踪——JWT令牌的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!