
文章目录概要JWT -- 登陆整体流程技术名词具体流程流程小结概要苍穹外卖中用户登陆过程采取基于JWT的token认证流程并在后续操作中进行权限认证。JWT – 登陆整体流程用户点击登陆按钮 --前端发送登陆请求 --后端查询数据库验证账户和密码 --生成JWT --返回token --前端保存token --退出登陆token自然失效技术名词JWT拦截器过滤器具体流程在这里当我们需要创建JWT令牌时我们需要先创建出JWT工具类我们一般命名为JwtUtil。而对于一个JWT工具类我们需要包含生成和解析这两个基本功能。生成publicstaticStringcreateJwt(StringsecretKey,longttlMillis,MapString,Objectclaims){// 指定使用的签名算法 -- 这里使用HS256SignatureAlgorithmsignatureAlgorithmSignatureAlgorithm.HS256;// 生成JWT的时间longexpMillisSystem.currentTimeMills()ttlMillis;DateexpnewDate(expMillis);// 设置JWT的bodyJwtBuliderbuilderJwts.bulider().setClaims(claims).signWith(signatureAlgorithm,secretKey.getBytes(StandardCharsets.UTF_8)).setExpiration(exp);returnbulider.compact();}解析publicstaticClaimsparseJWT(StringsecretKey,Stringtoken){ClaimsclaimsJwts.parser().setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8)).parseClaimsJws(token).getBody();returnclaims;}创建token在苍穹外卖中我们一般使用HashMap来存放我们的信息并通过调用JwtUtil工具类去创建tokenMapString,ObjectclaimsnewHashMap();claims.put(JwtClaimsConstant.EMP_ID,employee.getId());StringtokenJwtUtil.createJWT(jwtProperties.getAdminSecretKey(),jwtProperties.getAdminTtl(),claims);Tip这里的properties是我们的配置文件这样我们就拥有了token在本次登陆后前端就持有该token可以用于后续操作的权限认证那么我们就需要引入“拦截器”的概念。拦截器的作用可理解为其作用是在Controller执行前插入自己的逻辑对请求统一处理而不用在每个controller都编写相同的代码。另外拦截器同样能做到存储一些信息publicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponse,Objecthandler)throwsException{// 判断拦截到的是Controller还是其他资源if(!(handlerinstanceofHandlerMethod)){// 如果不是动态方法直接放行 -- css, jsreturntrue;}// 从请求头获取令牌Stringtokenrequest.getHander(jwtProperties.getAdminTokenName());// 校验令牌try{log.info(jwt校验{},token);ClaimsclaimsJwtUtil.parseJWT(jwtProperties.getAdminSecretKey(),token);LongempIdlong.valueOf(claims.get(JwtClaimsConstant.EMP_ID.toString());log.info(当前员工id:{},empId);returntrue;}catch(Exceptionex){response.setStatus(401);returnfalse;}}可见在上面的代码中我们可以将人员身份认证放到拦截器中并且在Controller执行前就进行判断而且拦截器中我们能将数据放入其中以待这个这次登陆的线程中调用。这样我们就会用到另外一个知识“ThreadLocal”ThreadLocal本质不是线程是一个量但与线程相关我们放在将来讨论。了解完了拦截器我们还需要了解过滤器。对于过滤器我们需要知道过滤器的执行策略所有的请求都会经过过滤器对请求和响应做统一处理所以最适合用来做与业务无关需要对所有请求生效的事情。做个对比吧对比项FilterInterceptor属于Servlet规范Spring MVC执行位置最早Controller前是否依赖 Srping否是常见用途编码跨域底层日志安全认证JWT未使用Spring Security时权限业务日志那么到这就了解完了苍穹外卖中基于JWT的token认证流程。流程小结对于用户登陆我们在苍穹外卖中采取基于JWT的token认证先通过存放个人信息用HashMap去存储并放入claims中然后调用Jwts这个工具类去创建token然后将响应体传给前端前端保存token的值放入请求头中随后在后续调用controller过程中通过我们创建的拦截器拦截器从请求头中取出token进行校验判断权限。