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

上海网站建设最佳方案饥饿营销案例

上海网站建设最佳方案,饥饿营销案例,免费素材哪个网站比较好,建设聚美优品网站收流量费吗问题描述: 当用户通过登陆后进入一个web网站,会把token保存到localStorage。假设token过期时间30min。 那么当用户在网站快乐地玩耍了30min后,这时进行了一次提交表单,它会被重定向到登陆页面。 作为用户:我表单填了…

问题描述:

当用户通过登陆后进入一个web网站,会把token保存到localStorage。假设token过期时间30min。

那么当用户在网站快乐地玩耍了30min后,这时进行了一次提交表单,它会被重定向到登陆页面。

作为用户:我表单填了这么久,点击提交时让我重新登陆?我的体验很不好。

 

jwt的好处和局限

jwt的好处是:服务器无需存储这些登陆的状态

而它的局限是:服务器无法主动地通知用户“你的token过期了,我重新给你一个”。

 

如何解决

方案一:双token

在登陆时我们会生成俩个token

  • token:表示正常情况下登陆凭证
  • refresh-token:表示需要刷新情况下登陆凭证

假设前者(token)设置过期时间为30min,后者为1天。

流程

  1. time=0min,用户成功登陆,后端返回俩个token(token和refresh-token),前端把它俩保存到localStorage
  2. time=10min,用户进行了一次查询,前端将俩个token都发给后端,后端检验token,有效,返回结果,用户很开心!
  3. time=35min,用户提交了表单,前端还是将俩个token发给后端;后端检验token,过期;检验refresh-token,有效,后端认为这是要刷新token,生成新的token和refresh-token,成功返回数据和双token。前端把数据渲染,把双token保存。

token正常过期的情况:

当然,token可以正常过期,如果在检验时refresh-token也过期,那就说明正常过期

假设time=0min时用户登陆,time=2天时用户提交了表单,那么后端认为这是正常过期,用户需要重新登陆。

流程图如下:

4aad52cfbf1e4747a640e2d379a75518.webp

token刷新并发问题

现在很多登陆是可以多端的,当多端并发都去尝试刷新token时,会导致token被重复刷新

方案二:刷新时用分布式锁

可以引入redis缓存中间件,使用缓存加速并处理并发刷新问题。

将双token生成后存入redis。当需要刷新token时,采用double-check+获取关于refresh-token的分布式锁来实现。

伪代码如下:

// 验证和刷新Token的方法
    public String validateAndRefreshToken(String userId, String accessToken, String refreshToken) {
        String storedAccessToken = redisTemplate.opsForValue().get(ACCESS_TOKEN_PREFIX + userId);
        String storedRefreshToken = redisTemplate.opsForValue().get(REFRESH_TOKEN_PREFIX + userId);

        // 检查Access Token是否有效
        if (storedAccessToken != null && storedAccessToken.equals(accessToken)) {
            return accessToken;  // 直接返回原始的Access Token
        }

        // Access Token无效,检查Refresh Token
        if (storedRefreshToken != null && storedRefreshToken.equals(refreshToken)) {
            // 使用双层检查和分布式锁控制高并发刷新
            String lockKey = "refresh_lock:" + userId;
            boolean lockAcquired = redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 5, TimeUnit.SECONDS);
            if (lockAcquired) {
                try {
                    // 再次双层检查(避免重复刷新)
                    storedAccessToken = redisTemplate.opsForValue().get(ACCESS_TOKEN_PREFIX + userId);
                    if (storedAccessToken == null) {
                        // 生成新的Access Token
                        String newAccessToken = generateToken();
                        redisTemplate.opsForValue().set(ACCESS_TOKEN_PREFIX + userId, newAccessToken, 15, TimeUnit.MINUTES);
                        return newAccessToken;
                    } else {
                        return storedAccessToken;  // 直接返回已刷新过的Token
                    }
                } finally {
                    redisTemplate.delete(lockKey);  // 释放锁
                }
            } else {
                // 未获取到锁,等待其他线程刷新完成,再次获取已刷新的Access Token
                return redisTemplate.opsForValue().get(ACCESS_TOKEN_PREFIX + userId);
            }
        }

        // 若Refresh Token也无效,返回null或抛出异常,需重新登录
        throw new TokenInvalidException("Access and Refresh Token both expired.");
    }

方案三:过渡时间(没看懂)

dbf7d02af8054b94ad4f32379ffa45f1.webp

 

 

 

http://www.ds6.com.cn/news/10460.html

相关文章:

  • wordpress子主题缺点国内做seo最好的公司
  • 洛阳做网站哪家便宜谷歌搜索引擎入口2021
  • 建设部网站官网挂证通报如何开展网络营销
  • 开通网站费可以做待摊费用吗万网域名
  • 怎样创建微网站高端网站设计公司
  • 如何建一个个人网站营销策略主要包括哪些
  • 建设网站要先给钱才能做seo是什么服
  • 观山湖区网站建设一键优化清理
  • 给素材网站做素材方法google浏览器官网下载
  • 做外贸网站如果是东西杂会不会不好推广郴州seo网络优化
  • 学做淘宝客网站有哪些推广运营公司哪家好
  • 网站活动策划怎么做郑州专业seo哪家好
  • 最新政府网站建设理念乐陵市seo关键词优化
  • 兴义哪有做网站专业网络推广软件
  • 公司建一个网站深圳网页设计公司
  • 大兴企业官网网站建设广州seo优化
  • 如何做响应式网站设计搜索seo引擎
  • 珠海网站建设公司哪个好模板建站网页
  • 网站面包屑怎么做如何推广自己产品
  • 西安病毒感染最新消息福州短视频seo
  • 网站做博彩反向代理违法郑志平爱站网创始人
  • 发布企业信息的网站百度登录个人中心官网
  • vue php 哪个做网站 好域名注册网站
  • 慈溪做无痛同济 amp 网站怎样策划一个营销型网站
  • 网站跟网页的区别独立站平台选哪个好
  • wordpress导入xls搜索引擎优化包括哪些
  • 亚网站建设免费做网站推广的软件
  • 如何建网络营销网站资源网站优化排名软件公司
  • 珠海网站建设防百度官网认证免费
  • 用word文档做网站软文文案范文