JWTtoken封装以及自动刷新方案建议
什么是JWT JWT 是一个开放标准,它定义了一种用于简洁,包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法。 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名 简单来说: 就是通过一定规范来生成token,然后可以通过解密算法逆向解密token,这样就可以获取用户信息
pom.xml io.jsonwebtoken jjwt 0.7.0
JWTUtil.javapackage com.xmj.utils; import com.xmj.model.LoginUser; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import lombok.extern.slf4j.Slf4j; import java.util.Date; import java.util.HashMap; import java.util.Map; @Slf4j public class JWTUtil { /** * token过期时间,正常是7天,方便测试我们设置70天 */ private static final long EXPIRE = 1000 * 60 * 60 * 7 * 10; /** * 加密的秘钥 */ private static final String SECRET = "xmj-cloud-0417"; /** * 令牌前缀 */ private static final String TOKEN_PREFIX = "xmj-cloud"; /** * SUBJECT */ private static final String SUBJECT = "xmj"; /** * 根据用户信息生成token * * @param loginUser * @return */ public static Map geneJsonWebToken(LoginUser loginUser) { if (loginUser == null) { throw new NullPointerException("loginUser对象为空"); } long deadLine = System.currentTimeMillis() + EXPIRE; // 生成token String token = Jwts.builder().setSubject(SUBJECT) .claim("headImg", loginUser.getHeadImg())//头像 .claim("id", loginUser.getId())//用户id .claim("email", loginUser.getMail())//用户邮箱 .claim("name", loginUser.getName())//用户名称 .setIssuedAt(new Date())//生成日期 .setExpiration(new Date(deadLine))// 过期时间为当前时间时间戳 + 过期时间 .signWith(SignatureAlgorithm.HS256, SECRET).compact();//签名算法和秘钥 // 返回可以选择加前缀 String realToken = TOKEN_PREFIX + token; Map map = new HashMap(); map.put("accessToken",realToken); // 过期时间,refreshToken使用 map.put("deadLine",deadLine); return map; } /** * 校验token的 方法 * * @param token * @return */ public static Claims checkJWT(String token) { try { final Claims claims = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token.replace(TOKEN_PREFIX, "")).getBody(); return claims; } catch (Exception e) { log.info("解密失败"); return null; } } }
用户登录操作/** * 用户登录 * 1、根据mail去找记录 * 2、有的话,则使用秘钥和用户传递的明文密码,进行加密,在和数据库中的进行匹配 * * @param loginRequest * @return */ @Override public JsonData login(UserLoginRequest loginRequest) { List userDOList = userMapper.selectList(new QueryWrapper().eq("mail", loginRequest.getMail())); if (userDOList != null && userDOList.size() == 1) { //已经注册 UserDO userDO = userDOList.get(0); String cryptPwd = Md5Crypt.md5Crypt(loginRequest.getPwd().getBytes(), userDO.getSecret()); if (cryptPwd.equals(userDO.getPwd())) { //登陆成功,生成accessToken、accessToken过期时间以及refreshToken LoginUser userDTO = new LoginUser(); BeanUtils.copyProperties(userDO, userDTO); Map map = JWTUtil.geneJsonWebToken(userDTO); // 生成refreshToken,页面静默获取token时候使用 String refreshToken = CommonUtil.generateUUID(); map.put("refreshToken", refreshToken); redisTemplate.opsForValue().set("refreshToken", "随意的value值", 1000 * 60 * 60 * 24 * 30); return JsonData.buildSuccess(map); } else { return JsonData.buildResult(BizCodeEnum.ACCOUNT_PWD_ERROR); } } else { //未注册 return JsonData.buildResult(BizCodeEnum.ACCOUNT_PWD_ERROR); } }
在前后分离场景下,越来越多的项目使用jwt token作为接口的安全机制,但存在jwt过期后,用户无法直接感知,假如在用户操作页面期间,突然提示登录,则体验很不友好,所以就有了token自动刷新需求;
方案:前端控制检测token,无感知刷新
用户登录成功的时候,一次性给他两个Token,分别为AccessToken和RefreshToken
AccessToken有效期较短,比如1天或者5天,用于正常请求
RefreshToken有效期可以设置长一些,例如10天、20天,作为刷新AccessToken的凭证
刷新方案:当AccessToken即将过期的时候,例如提前30分钟,客户端利用RefreshToken请求指定的API获取新的AccessToken并更新本地存储中的AccessToken
核心逻辑
1、登录成功后,jwt生成AccessToken; UUID生成RefreshToken并存储在服务端redis中,设置过期时间
2、接口返回3个字段AccessToken/RefreshToken/访问令牌过期时间戳
3、由于RefreshToken存储在服务端redis中,假如这个RefreshToken也过期,则提示重新登录;
老王的疑问:RefreshToken有效期那么长,和直接将AccessToken的有效期延长有什么区别
答:RefreshToken不像AccessToken那样在大多数请求中都被使用,主要是本地检测accessToken快过期的时候才使用,
一般本地存储的时候,也不叫refreshToken,前端可以取个别名,混淆代码让攻击者不能直接识别这个就是刷新令牌
缺点:前端每次请求需要判断token距离过期时间
优点:后端压力小,代码逻辑改动不大
刷新token方法未实现。/** * 刷新token * * @param param * @return */ //@ApiOperation("刷新accessToken") //@PostMapping(value = "/login") //public JsonData login(@ApiParam("用户登录对象") @RequestBody UserLoginRequest loginRequest) { //找redis中refresh_token是否存在 //refresh_token存在,解密accessToken //重新调用JWTUtil.geneJsonWebToken()生成accessToken //重新生成refreshToken,并存储redis,设置过期时间 //返回给前端 // return jsonData; //}
谷歌广告ampampampFacebook广告,谁才是B2B的王者之选?投广告,是任何外贸企业线上营销无法规避的的话题,把钱花在刀刃上,也成为大家的普遍共识,然而,做广告,我该投谁呢?Google广告,Facebook广告成为大家最纠结的问题!那么今天
优质海关数据应该具备的5大功能4月13日海关总署发布我国2021年第一季度物贸易进出口总值8。47万亿元,比去年同期增长29。2,其中出口4。61万亿元,增长38。7,跨境电商出口2808亿元,增长69。3。2
邮件群发邮件追踪,外贸获客必备一笔海外订单的形成,通常是从一封开发信开始的。在往期文章中介绍了如何查找潜客邮箱并进行有效邮箱验证,提升客户开发的精准度和成功率,同时也介绍了通过一些指标Openrate(邮件阅览
运动会速看,全球搜技术人的十八般武艺四月如诗,陌上花开,怎能少了全球搜小伙伴们的一丝风采呢?2021年度春季运动会如期而至,挥笔如剑,编码如刀的全球搜人化身为运动健儿,又将会是上演怎样的一出好戏呢?精彩抢先看本次运动
长期复购客户达十几家!这家B2B企业的营销思路值得借鉴企业探访惠州众沐工艺礼品企业背景2010年成立的惠州众沐工艺礼品有限公司,是一家专注于纪念奖项等五金工艺制品解决方案的企业,产品包括奖章,钥匙扣,首饰盒,开瓶器等。凭借一流的技术以
工程师行业危机35岁就该退休了吗?微风引言微风为什么在我们这个行业,很少会看到大量白发苍苍的软件开发者?那些年长的程序员都去哪儿了?公司会淘汰年龄大的程序员吗?图源TimaMiroshnichenko如果一个50多
做外贸如何推广自己的品牌?让网站流量翻番现如今做外贸,独立站私域流量池已经成为许多外贸企业的标配,独立站有了,如何进行有效推广则是即将要面临的问题。推广做的好,那么海外客户看到您企业产品的机率也就更大。下面给大家介绍几种
全球搜赋能广西产业,助力桂品出海4月8日,全球搜受邀出席由广西壮族自治区商务厅主办的跨境电子商务综合能力培训主题会议,全球搜上海分公司罗柱先生作为授课讲师进行了官网营销,智胜未来的主题分享,将跨境出海数字营销理念
外贸人,采购决策人应该这样找在外贸开发中不免会遇到过以上的情况,由于没有直接和目标客户的采购决策人建立联系,结果导致整个开发过程的漫长,甚至导致客户的丢失。对于外贸B2B企业来说,外贸开发难度就大,开发时间也
外贸网站设计赏析来啦500套等你挑选DESIGN独立站官网设计始于颜值,陷于产品,忠于品质。这句话非常适合独立站营销流程,绝大多数完整的海外采购流程,网站的颜值都功不可没,虽然不是决定因素,但在对企业形象的塑造上,有
星案例产品多,服务种类多!转型独立站后,询盘接到手软广州作为中国重要的贸易进出口集散城市之一,其中隐藏在巨大的国际贸易商机,但奈何竞争对手太多,能够做出成绩的企业也寥寥无几,但广州的一家国际采购服务企业却通过线上营销的模式,在202
同学们的老熟人李华被注册成商标了昨天,随着高考的最后一声铃响,2021年高考正式落下帷幕。一般来说,高考最后一门科目都是英语考试,而英语考题中最值得注意的就是英语写作部分了。每年,考生们都需要帮助一位名叫李华的同
长城起名小能手,商标又出花样?起名是个技术活,长城汽车在这方面颇有心得,花式起名出圈,诸如哈佛大狗长城炮坦克300等,不仅名字如雷贯耳,销量也十分喜人。近日,小知查询发现,长城汽车不仅是起名小能手,在商标注册保
挖高管注册OCar商标,OPPO也要造车了?充电5分钟,开车两小时?又一个手机厂商OPPO显示出造车的苗头。据了解,OPPO广东移动通信有限公司于今年5月份申请了OCar商标,注册在第9类科学仪器相关产品上。OCar商标由字
苹果跟高通的授权费问题越闹越大了苹果跟高通之间的授权费纠纷,现在又有了新的进展。后者在月初提出反诉后,现在又发布了一份声明,其中提到苹果最近已停止向iPhone制造商支付涉及高通的授权费,因为其坚持认为自己已经为
小米MIX系列又回来了,这次的版本惊喜更多,将首发液体镜头自从小米官宣了春季新品发布会后,可以说本人就一直在关注着小米的微博,就等着新品的官宣,看看小米这一次带给大家的到底是不是惊喜。可以说,再看见小米官宣小米11大杯超大杯的时候,本人就
新品亮相小米MIX新体验,让普通人能买得起的折叠屏3月29日,小米召开以生生不息为主题的新品发布会。发布会上,不少新产品和黑科技首次亮相,赚足米粉们的眼球。小米自研澎湃芯片,硅氧负极电池,液态镜头以及旗舰影像等众多新科技惊艳亮相,
小米新机再度来袭,有了超高性能不够,游戏体验也很能打小米一直以来的表现米粉们有目共睹,从内部配置再到核心技术,小米都是诚意满满,先前斥巨资打造土豪邀请函,而且还投入了巨额前期预算,种种迹象都表明小米始终在玩真的,没有与米粉们开玩笑。
小米三星联合研发大底GN2,与小米11Pro碰撞一起会怎样3月29日,小米发布会正式举行。在这次的发布会上,让我觉得十分惊喜的就是小米与三星联合研发的GN2超大底。众所周知,现在智能手机市场真正的短板其实在影像技术。现在的智能手机虽然能够
健康烹饪新味道,秘诀就在于方太油烟机灶台套装在我心里,中餐永远是味道最丰富菜式变幻最多的饮食风格,无论是以炖为主香气扑鼻的东北菜,还是以麻为主辅辣增味的激爽川菜,亦或是用料考究制作精细的粤菜,都夹杂着中国人特殊的饮食哲学和生
香港证监会已收到多个关于加密货币ETF的请求加密货币总市值突破2。8万亿美元,超过微软和苹果据最新数据显示,目前加密货币总市值已突破2。8万亿美元,本文撰写时为2,855,724,225,981美元,24小时涨幅3。2,超过
兰蔻x百人测评团联动出击,探索双十一品牌增量密码早在国庆的时候,就有网友在微博调侃说10月的工资随了份子,而11月的工资用来双十一,把自己安排的明明白白。实际上,双十一活动如今早已如火如荼地进行了数日,从预售到返场,不断拉长的双