当前位置: 首页 > news >正文

微信小程序免费模板直接套用佛山快速排名seo

微信小程序免费模板直接套用,佛山快速排名seo,遵义市住房和城乡建设局官方网站,正版素材网站一.JWT简介 1.概念 JWT (JSON Web Token) 是一种用于在网络上安全传输信息的开放标准#xff08;RFC 7519#xff09;。它是一种紧凑且自包含的方式#xff0c;用于在不同组件之间传递信息#xff0c;通常用于身份验证和授权目的。JWT 是以 JSON 格式编码的令牌#xff… 一.JWT简介 1.概念 JWT (JSON Web Token) 是一种用于在网络上安全传输信息的开放标准RFC 7519。它是一种紧凑且自包含的方式用于在不同组件之间传递信息通常用于身份验证和授权目的。JWT 是以 JSON 格式编码的令牌它包含了声明claims并使用数字签名或加密来验证其完整性 2.组成 Header头部头部通常包括两部分信息标明该令牌的类型typ以及所使用的签名算法alg。例如 { alg: HS256,typ: JWT } 在头部中通常也可以指定使用非对称加密算法例如RSA来进行签名或加密。 Payload负载负载包含了一组声明这些声明描述了令牌的一些信息。有三种类型的声明 Registered Claims注册声明这些是一些预定义的声明包括 iss令牌的发行者、sub主题、aud受众、exp过期时间、nbf生效时间、iat发布时间等。Public Claims公共声明这些声明可以由令牌的发行者和使用者协商定义。Private Claims私有声明这些是自定义的声明用于在双方之间共享信息。例如 { sub: 1234567890, name: John Doe, iat: 1516239022 } Signature签名签名用于验证令牌的完整性和真实性。签名是通过使用头部中指定的签名算法以及密钥来计算的。它可以防止令牌被篡改。签名是在头部和负载的 Base64 编码字符串上计算的例如 HMACSHA256( base64UrlEncode(header) . base64UrlEncode(payload), secret) 这个签名将会附加在令牌的末尾形成最终的JWT如header.payload.signature。 3.JWT 的主要优势 自包含JWT 包含了所有必要的信息不需要在服务器端存储会话信息。可验证接收方可以验证令牌的完整性和真实性因为签名是依靠密钥计算的。跨域JWT 可以在不同域之间传递因为它是一种标准格式。扩展性可以包含自定义声明适用于各种不同的应用场景。轻量级JWT 是一种紧凑的数据格式易于传输和处理。 然而要注意的是JWT 令牌的安全性高度依赖于密钥的安全性。如果密钥泄露那么攻击者可能能够伪造有效的JWT。因此必须妥善保管密钥并使用适当的安全措施来保护JWT。 二.JWT的工具类 package com.YU.ssm.jwt;import java.util.Date; import java.util.Map; import java.util.UUID;import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec;import org.apache.commons.codec.binary.Base64;import io.jsonwebtoken.Claims; import io.jsonwebtoken.JwtBuilder; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm;/*** JWT验证过滤器配置顺序 CorsFilte-JwtUtilsr--StrutsPrepareAndExecuteFilter**/ public class JwtUtils {/*** JWT_WEB_TTLWEBAPP应用中token的有效时间,默认30分钟*/public static final long JWT_WEB_TTL 30 * 60 * 1000;/*** 将jwt令牌保存到header中的key*/public static final String JWT_HEADER_KEY jwt;// 指定签名的时候使用的签名算法也就是header那部分jwt已经将这部分内容封装好了。private static final SignatureAlgorithm SIGNATURE_ALGORITHM SignatureAlgorithm.HS256;private static final String JWT_SECRET f356cdce935c42328ad2001d7e9552a3;// JWT密匙private static final SecretKey JWT_KEY;// 使用JWT密匙生成的加密keystatic {byte[] encodedKey Base64.decodeBase64(JWT_SECRET);JWT_KEY new SecretKeySpec(encodedKey, 0, encodedKey.length, AES);}private JwtUtils() {}/*** 解密jwt获得所有声明(包括标准和私有声明)* * param jwt* return* throws Exception*/public static Claims parseJwt(String jwt) {Claims claims Jwts.parser().setSigningKey(JWT_KEY).parseClaimsJws(jwt).getBody();return claims;}/*** 创建JWT令牌签发时间为当前时间* * param claims* 创建payload的私有声明根据特定的业务需要添加如果要拿这个做验证一般是需要和jwt的接收方提前沟通好验证方式的* param ttlMillis* JWT的有效时间(单位毫秒)当前时间有效时间过期时间* return jwt令牌*/public static String createJwt(MapString, Object claims, long ttlMillis) {// 生成JWT的时间即签发时间 2021-10-30 10:02:00 - 30 10:32:00long nowMillis System.currentTimeMillis();//链式语法// 下面就是在为payload添加各种标准声明和私有声明了// 这里其实就是new一个JwtBuilder设置jwt的bodyJwtBuilder builder Jwts.builder()// 如果有私有声明一定要先设置这个自己创建的私有的声明这个是给builder的claim赋值一旦写在标准的声明赋值之后就是覆盖了那些标准的声明的.setClaims(claims)// 设置jti(JWT ID)是JWT的唯一标识根据业务需要这个可以设置为一个不重复的值主要用来作为一次性token,从而回避重放攻击。// 可以在未登陆前作为身份标识使用.setId(UUID.randomUUID().toString().replace(-, ))// iss(Issuser)签发者写死.setIssuer(YU)// iat: jwt的签发时间.setIssuedAt(new Date(nowMillis))// 代表这个JWT的主体即它的所有人这个是一个json格式的字符串可放数据{uid:zs}。此处没放// .setSubject({})// 设置签名使用的签名算法和签名使用的秘钥.signWith(SIGNATURE_ALGORITHM, JWT_KEY)// 设置JWT的过期时间.setExpiration(new Date(nowMillis ttlMillis));return builder.compact();}/*** 复制jwt并重新设置签发时间(为当前时间)和失效时间* * param jwt* 被复制的jwt令牌* param ttlMillis* jwt的有效时间(单位毫秒)当前时间有效时间过期时间* return*/public static String copyJwt(String jwt, Long ttlMillis) {//解密JWT获取所有的声明私有和标准//oldClaims claims parseJwt(jwt);// 生成JWT的时间即签发时间long nowMillis System.currentTimeMillis();// 下面就是在为payload添加各种标准声明和私有声明了// 这里其实就是new一个JwtBuilder设置jwt的bodyJwtBuilder builder Jwts.builder()// 如果有私有声明一定要先设置这个自己创建的私有的声明这个是给builder的claim赋值一旦写在标准的声明赋值之后就是覆盖了那些标准的声明的.setClaims(claims)// 设置jti(JWT ID)是JWT的唯一标识根据业务需要这个可以设置为一个不重复的值主要用来作为一次性token,从而回避重放攻击。// 可以在未登陆前作为身份标识使用//.setId(UUID.randomUUID().toString().replace(-, ))// iss(Issuser)签发者写死// .setIssuer(zking)// iat: jwt的签发时间.setIssuedAt(new Date(nowMillis))// 代表这个JWT的主体即它的所有人这个是一个json格式的字符串可放数据{uid:zs}。此处没放// .setSubject({})// 设置签名使用的签名算法和签名使用的秘钥.signWith(SIGNATURE_ALGORITHM, JWT_KEY)// 设置JWT的过期时间.setExpiration(new Date(nowMillis ttlMillis));return builder.compact();} } 1.工具类解析 1.初始化相关信息 JWT_WEB_TTL常量定义了JWT令牌的有效时间单位是毫秒默认为30分钟。这个常量指定了在WEBAPP应用中生成的JWT令牌的有效期限。 JWT_HEADER_KEY常量定义了JWT令牌在HTTP请求的头部中的键名。在HTTP请求的头部中JWT令牌会作为值与这个键名相关联用于传递JWT令牌。 SIGNATURE_ALGORITHM常量指定了在JWT中使用的签名算法。在这个例子中使用了HS256HMAC SHA-256签名算法。HS256是一种使用密钥进行签名和验证的算法。 JWT_SECRET常量指定了用于生成JWT签名的密钥。在这个例子中密钥是一个字符串用于生成JWT签名。请注意实际应用中应该将密钥存储在安全的地方不建议硬编码在代码中。 JWT_KEY常量使用JWT_SECRET密钥生成的加密key。这个key用于在生成JWT签名时进行加密。 静态块这个类中的静态块用来初始化JWT_KEY。在静态块中JWT_SECRET字符串经过Base64解码并使用解码后的字节数组创建了一个SecretKeySpec对象用于生成JWT签名时的加密key。 2.解密JWT令牌 使用Jwts.parser()创建一个JWT解析器对象。 使用.setSigningKey(JWT_KEY)方法将JWT解析器配置为使用特定的密钥JWT_KEY来验证JWT令牌的签名。这是为了确保JWT令牌的完整性和真实性。 使用.parseClaimsJws(jwt)方法来解析传入的JWT令牌jwt并将其转换为JwsClaims对象。Jws表示JWT令牌的完整签名结构包括头部、负载和签名。 最后使用.getBody()方法从Jws对象中获取JWT令牌的声明部分这些声明包括标准声明例如iss、sub、exp等以及任何自定义的私有声明。这些声明将被包装在一个Claims对象中。 如果JWT解析成功将返回包含声明的Claims对象如果JWT解析成功将返回包含声明的Claims对象 3.创建JWT令牌 获取当前时间的时间戳用作JWT令牌的签发时间。 使用JwtBuilder对象创建JWT令牌采用链式语法。 使用.setClaims(claims)方法设置JWT的声明部分包括标准声明和自定义的私有声明。claims参数是一个包含声明信息的Map对象。 使用.setId()方法设置JWT的唯一标识通常用于防止重放攻击。 使用.setIssuer(YU)方法设置JWT的签发者。 使用.setIssuedAt()方法设置JWT的签发时间。 使用.signWith(SIGNATURE_ALGORITHM, JWT_KEY)方法来对JWT进行签名SIGNATURE_ALGORITHM表示签名算法JWT_KEY表示用于签名的密钥。 使用.setExpiration()方法设置JWT的过期时间即JWT的有效期。 最后使用.compact()方法将JWT令牌压缩为字符串并返回 4. 复制jwt 方法签名这个方法被定义为public static String copyJwt(String jwt, Long ttlMillis)它接受两参数jwt是要被复制的JWT令牌ttlMillis是JWT的有效时间以毫秒为单位。ttlMillis会被用来计算新JWT的失效时间。 解密JWT在方法内部的第一行代码调用了parseJwt(jwt)函数来解密jwt并将其内容提取为声明claims包括标准声明和私有声明。 签发时间Issued At - iat在JWT的payload令牌的主体部分中设置了签发时间即iat。这个时间用System.currentTimeMillis()获取当前时间然后作为JWT的签发时间。 JWT的构建接下来通过JwtBuilder对象来构建一个新的JWT。这个对象会包含JWT的各种声明。 私有声明在JWT中你可以包含一些自定义的私有声明用来存储额外的信息。在这个代码中通过.setClaims(claims)将之前解密的声明添加到JWT的payload中。 唯一标识JWT ID - jti这段代码注释掉了唯一标识声明的设置但你可以根据需要取消注释并为每个JWT生成一个唯一的标识。 签发者Issuer - iss签发者声明通常是JWT的签发者这里被写死为zking。 签名算法和秘钥使用.signWith(SIGNATURE_ALGORITHM, JWT_KEY)设置JWT的签名算法和秘钥以确保JWT的完整性和安全性。 失效时间最后通过.setExpiration(new Date(nowMillis ttlMillis))设置JWT的失效时间。失效时间是签发时间加上有效时间(ttlMillis)。 返回值最后使用builder.compact()将JWT构建为一个紧凑的字符串表示并返回这个字符串。 2.JWT测试 package com.YU.ssm.service.impl;import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map;import com.YU.ssm.jwt.JwtUtils; import io.jsonwebtoken.Claims; import org.junit.*;public class JwtDemo {private SimpleDateFormat sdf new SimpleDateFormat(yyyy-MM-dd HH:mm:ss.SSS);Testpublic void test1() {// 生成JWT//JWT TokenHeader.Payload.Signature//头部.载荷.签名//Payload标准声明私有声明公有声明//定义私有声明MapString, Object claims new HashMapString, Object();claims.put(username, zss);claims.put(age, 18);//TTL:Time To LiveString jwt JwtUtils.createJwt(claims, JwtUtils.JWT_WEB_TTL);System.out.println(jwt);//获取Payload包含标准和私有声明Claims parseJwt JwtUtils.parseJwt(jwt);for (Map.EntryString, Object entry : parseJwt.entrySet()) {System.out.println(entry.getKey() entry.getValue());}Date d1 parseJwt.getIssuedAt();Date d2 parseJwt.getExpiration();System.out.println(令牌签发时间 sdf.format(d1));System.out.println(令牌过期时间 sdf.format(d2));}Testpublic void test2() {// 解析oldJwt//io.jsonwebtoken.ExpiredJwtExceptionJWT过期异常//io.jsonwebtoken.SignatureException签名异常//String oldJwteyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1OTA3MTg2NzcsImlhdCI6MTU5MDcxNjg3NywiYWdlIjoxOCwianRpIjoiNDFmZjFiZGFkYzkxNDA3OGE4ZGUyNGRkZDEwYjU4N2IiLCJ1c2VybmFtZSI6InpzcyJ9.DdPvioX6kuhV6lEfD9QAN2eQSk_mO3dYkmDmTQsqa78;//eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MzU1NjE3MjcsImlhdCI6MTYzNTU1OTkyNywiYWdlIjoxOCwianRpIjoiN2RlYmIzM2JiZTg3NDBmODgzNDI5Njk0ZWE4NzcyMTgiLCJ1c2VybmFtZSI6InpzcyJ9.dUR-9JUlyRdoYx-506SxXQ3gbHFCv0g5Zm8ZGzK1fzwString newJwteyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ6a2luZyIsImV4cCI6MTY2MjM0Njg3MSwiaWF0IjoxNjYyMzQ1MDcxLCJhZ2UiOjE4LCJqdGkiOiI4YjllNzc3YzFlMDM0MjViYThmMDVjNTFlMTU3NDQ1MiIsInVzZXJuYW1lIjoienNzIn0.UWpJxPxwJ09PKxE2SY5ME41W1Kv3jP5bZGKK-oNUDuM;String oldJwt eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MzU1NjE3MjcsImlhdCI6MTYzNTU1OTkyNywiYWdlIjoxOCwianRpIjoiN2RlYmIzM2JiZTg3NDBmODgzNDI5Njk0ZWE4NzcyMTgiLCJ1c2VybmFtZSI6InpzcyJ9.dUR-9JUlyRdoYx-506SxXQ3gbHFCv0g5Zm8ZGzK1fzw;Claims parseJwt JwtUtils.parseJwt(newJwt);for (Map.EntryString, Object entry : parseJwt.entrySet()) {System.out.println(entry.getKey() entry.getValue());}Date d1 parseJwt.getIssuedAt();Date d2 parseJwt.getExpiration();System.out.println(令牌签发时间 sdf.format(d1));System.out.println(令牌过期时间 sdf.format(d2));}Testpublic void test3() {// 复制jwt并延时30分钟String oldJwt eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ6a2luZyIsImV4cCI6MTY2MjM0Njg3MSwiaWF0IjoxNjYyMzQ1MDcxLCJhZ2UiOjE4LCJqdGkiOiI4YjllNzc3YzFlMDM0MjViYThmMDVjNTFlMTU3NDQ1MiIsInVzZXJuYW1lIjoienNzIn0.UWpJxPxwJ09PKxE2SY5ME41W1Kv3jP5bZGKK-oNUDuM;//String newJwt eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MDU3NTM2NTUsImlhdCI6MTYwNTc1MTg1NSwiYWdlIjoxOCwianRpIjoiYmNmN2Q1MzQ2YjE3NGU2MDk1MmIxYzQ3ZTlmMzQyZjgiLCJ1c2VybmFtZSI6InpzcyJ9.m1Qn84RxgbKCnsvrdbbAnj8l_5Jwovry8En0j4kCxhc;//String oldJwt eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NjI5MDMzNjAsImlhdCI6MTU2MjkwMTU2MCwiYWdlIjoxOCwianRpIjoiZDVjMzE4Njg0MDcyNDgyZDg1MDE5ODVmMDY3OGQ4NjkiLCJ1c2VybmFtZSI6InpzcyJ9.XDDDRRq5jYq5EdEBHtPm7GcuBz4S0VhDTS1amRCdf48;String newJwt JwtUtils.copyJwt(oldJwt, JwtUtils.JWT_WEB_TTL);System.out.println(newJwt);Claims parseJwt JwtUtils.parseJwt(newJwt);for (Map.EntryString, Object entry : parseJwt.entrySet()) {System.out.println(entry.getKey() entry.getValue());}Date d1 parseJwt.getIssuedAt();Date d2 parseJwt.getExpiration();System.out.println(令牌签发时间 sdf.format(d1));System.out.println(令牌过期时间 sdf.format(d2));}} 1.测试方法1 运行结果 当我们通过携带身份信息运行时会获得jwt值并携带它的一个签发时间和过期值 2.测试方法2 我们可以通过token值来解析获取到令牌的信息以及签发时间和过期时间但是只能获取到还未过期的令牌 当我们使用已经过期的令牌时会抛出异常 例 1.已过期令牌 2.未过期令牌 使用未过期令牌即可获取它的登录信息值以及它的签发时间和过期时间 3.测试方法3 复制延长jwt值的有效时间 可以对比上面的令牌时间我们使用同一个令牌进行延长时间  三.JWT集成spa项目 1.定义好jwt的基本信息 1.1定义变量 export default {TName:YU,jwt: } 1.2 基本get、set方法 setJWT:(state,payload){state.jwt payload.jwt;} getJWT:(state){return state.jwt;} 2.存值 2.1 在响应拦截器和请求拦截器中将响应头中的jwt串放入state.js中 // 请求拦截器 axios.interceptors.request.use(function(config) {let jwt window.vm.$store.getters.getJWT;if(jwt){config.headers[jwt] jwt;}return config; }, function(error) {return Promise.reject(error); });// 响应拦截器 axios.interceptors.response.use(function(response) {let jwt response.headers[jwt];if(jwt){window.vm.$store.commit(setJWT,{jwt:jwt});}return response; }, function(error) {return Promise.reject(error); }); 2.2执行效果 我们在登录之后的userLogin包中会展示我们的jwt值
http://www.w-s-a.com/news/671593/

相关文章:

  • 做网站能赚钱么用wordpress搭建知名网站
  • 阿里云服务器网站开发青岛做网站找哪家
  • 凡科做的网站为什么打不开织梦cms仿某作文网站整站源码(带采集)安装数据库
  • 免费h5模板网站模板汽车报价网址
  • 蔡甸网站建设烟台网站建设yt
  • 最流行的网站开发新开的网页游戏平台
  • 暴富建站wordpress 标签分类
  • 搞笑网站源码百度快照替代
  • 重庆网站建设哪家公司哪家好关键词是怎么排名的
  • 青县网站建设今天国际大事新闻
  • 深圳正规网站制作哪里好怎样优化网络
  • 米拓网站建设教程dw成品网站成品视频教学
  • 用jsp做的网站源代码天门网站网站建设
  • 百度如何把网站做链接地址有没有资源可以在线观看
  • 淮安做网站找哪家好电子商务网站建设规划书的内容
  • 开发网站建设用什么框架php黄页系统
  • 聊城制作网站全球十大电商平台排名
  • 用什么来网站开发好mega menu wordpress
  • 深圳制作网站有用吗wordpress的主题
  • 网站的规划与创建天津市南开区网站开发有限公司
  • 免备案网站主机建站哪个平台好
  • python做网站 不适合单页营销分享网站
  • 珠海市研发网站建设建设网站挣钱
  • 阿里巴巴国际站特点做wps的网站赚钱
  • wordpress更换域名后网站打不开宜昌建设银行网站
  • 写出网站开发的基本流程百度网页电脑版入口
  • 网站设计有限公司怎么样网站建设西班牙语
  • 网站安全解决方案宁波seo网络推广优化价格
  • 做网站带来好处wordpress可以做oa系统吗
  • 建筑设计人才招聘网站h5营销型网站suteng