小程序 手机号+短信验证码登录问题

场景:
我定义了两个全局静态变量 mobile 和message(短信验证码)
多人同时登录
发送短信验证码是一个接口 会把验证码和手机号赋值给两个静态变量
之后访问登录用这个接口 会验证传过来的手机号 验证码 和静态变量里面的
手机号和验证码

出现的问题:
短信发送成功 但是在登录这个接口中验证手机号的时候 手机号验证不一致

        按理来说 没登录一个人 tomcat会开放不同的线程 (本人对线程没做操作)
        不会出现上述那个问题



        求大佬解答下为什么会出现这个问题

4个回答

Map保存起来 一个手机号对应一个验证码

east123321
east123321 回复: 也可以自己设置一个静态的缓存区,比如LinkedList,HashMap,每次从里面读取或增删即可。不过验证码的过期时间就不好操作了
一年多之前 回复
east123321
east123321 回复syso_love: 。。。临时数据存到数据库里面是没有必要的,白白消耗性能
一年多之前 回复
syso_love
syso_love 我给了项目经理两种解决方案 一是存到库里 二是存到session中或者缓存中 但是目前都不想用这两种方案 我也没办法 再说用redis的话我还要给他公司安装redis 我才拿这点钱 不至于给公司安装这个
一年多之前 回复
east123321
east123321 回复syso_love: 还方便设置验证码的过期时间
一年多之前 回复
east123321
east123321 回复syso_love: 了解一下Redis
一年多之前 回复
syso_love
syso_love 你这个想法太不成熟啊 我觉得
一年多之前 回复

多人同时登陆,是并发;而你使用全局共享变量,肯定会出现问题的呀;

a: 发送短信,然后再去登陆的时候,恰巧b已经发送短信结束,会覆盖a的信息,a再去验证的时候,全局变量都是b的信息,当然不一样啊

tomcat即使有很多线程,但他们公用 全局变量的,可以了解下jvm工作原理,会对你有所帮助

syso_love
syso_love 变量不是存在栈中吗 栈因为是运行单位,因此里面存储的信息都是跟当线程(或程序)相关信息的。包括局部变量、程序运行状态、方法返回值等等;而堆只负责存储对象信息。所以变量不是共享的啊 只有对象才是共享的啊
一年多之前 回复

登陆一个人开放一个线程是什么情况,验证是否匹配的时候,可以把验证码存缓存或者session把,手机号为键,验证吗为值

静态变量是全局共享的,只要有修改,全局都会改变,栈,方法又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问