做企业网站需要什么条件,南通网站建设哪家好,怎么做淘宝客网站优化,体育新闻一、前言
使用一些用户不友好的项目时#xff0c;会发现#xff0c;每一次进入网站#xff0c;我们都要重新登录。 这是为什么呢#xff1f; 现代多采用前后端分离的项目架构#xff0c;这种架构#xff0c;前后端使用不同的服务器#xff0c;两个服务器上存储的信息不…一、前言
使用一些用户不友好的项目时会发现每一次进入网站我们都要重新登录。 这是为什么呢 现代多采用前后端分离的项目架构这种架构前后端使用不同的服务器两个服务器上存储的信息不一致。 用户一般直接访问的是前端服务器。 在后端为了避免恶意攻击开发者必须考虑身份验证的问题。 简单点说你必须只让允许的人进来。 解决方案很多过去常用的是cookie后来为了安全又延伸出一个session。 再后来由于分布式开发的需求和性能的需求必须有一个统一管理的验证机制这就是出现了token验证。 不过token信息存储在数据库中且无结构化信息使用起来相对麻烦。 我们需要一个机制不存储在数据库中并且能够方便访问。 这就是衍生出的JWT这也是今天话题的主角。
二、JWT的基础信息
JWT令牌的本质就是一段加密过的字符串。JWT令牌全称叫Json Web Token。JWT由3个部分组成头部header、负载payload、签名signature。JWT的头部存储配置信息。JWT的负载存储真正传输的数据。JWT的签名是认证的核心保证其不被修改。
三、JWT的头部header
header存储配置信息一般有2个
typ : jwt类型表示令牌种类一般是jwtalgHS256加密算法种类比较多。
四、JWT的负载payload
这是存储数据的区域具体内容由开发者自定义一般会写
subject主题表示这个jwt令牌干什么用的可以自定义。exp过期时间这个最重要一般的jwt令牌都会有。其它比如用户的id使得JWT一定唯一。
五、JWT的签名signature
签名是最重要的验证机制它由头部、负载和密钥三部分信息经过算法加密而成具体内容不确定调用算法即可。 密钥密钥可以自定义或随机生成但是要符合一定规则。【密钥一般是一段字符串如果使用工具生成也可以是一个SecretKey包装类】 比如使用HS256算法加密密钥就必须在256bits以上。【其它的视具体算法确定一般都是长度规则】 密钥必须妥善保管这是保证jwt令牌唯一的重要数据。
六、JWT是如何保证唯一的
在负载payload中一般会有几个属性能够唯一标识用户。 比如用户id、用户name、用户手机号。 如果这个用户jwt丢失重新访问后端服务器由于过期时间一般固定也能保证jwt唯一就算不唯一只要满足规则其访问也不会出错。
七、JWTUtil工具类如何构建
经过上面的学习我们大概知道jwt是什么了那么就该了解它的使用方法了。
第一流程
jwt是我们后端服务器生成的一段字符串所以要有创建这一步骤。 当前端把jwt令牌传来时我们要把它解析成可以理解的格式所以也要有解析这一步骤。 过滤器的构建是Spring MVC的内容在此不介绍。 忽略过滤器的构建我们只需要做两件事创建jwt和解析jwt。
第二创建jwt【负载根据需求自己设置】
由于jwt有3个部分所以要分别构建头部、负载和签名。 代码基本固定为
public static String createJWT(String id){// 设定jwt的头部、负载并进行签名和打包链接// jwt比较复杂所以用builder构建JwtBuilder builder Jwts.builder();// 设定头部的方法setHeadParamString res builder.setHeaderParam(alg, HS256).setHeaderParam(typ, jwt)// 设定负载的方法claim.claim(username,tom).claim(id, id).claim(permission, 0)// 常用的一些负载允许用内置方法设置.setSubject(test_admin).setExpiration(new Date(System.currentTimeMillis()ttlMillis))// 签名方法指定加密算法HS256和密钥SECRET_KEY.signWith(SignatureAlgorithm.HS256, SECRET_KEY)// compact是将三个部分连接起来并返回一个字符串。【3部分通过.号连接】.compact();// 转化为字符串return res;
}第三解析JWT令牌
由于签名用于确保信息有效头部是配置信息所以对于业务逻辑最关键的是负载payload。 在jwt机制中payload采用Claims类存储。 Claims类一个数据类本质就是一个Map结构。 通过key得到value。 由于JWTUtil类只创建、解析jwt而不进行其它的业务逻辑所以应该把Claims传递给其它方法处理。 当然为了方便我们可以将Claims的数据拿出来存储在一个Map中再交给其它方法处理。 固定的代码为
public static Claims parseJWT(String jwt){// 创建JWTPaser实例JwtParser jwtParser Jwts.parser();// 按照密钥、jwt令牌解密JwsClaims claimsJws jwtParser.setSigningKey(SECRET_KEY).parseClaimsJws(jwt);// claims类有一个Map存储一对一的数据Claims claims claimsJws.getBody();// 返回给上级处理return claims;
}八、结语
我是蚊子码农如有补充欢迎在评论区留言。个人的知识体系可能没有那么完善希望各位多多指正谢谢大家。