验证码存入session问题
我将验证码存入session中。1.但是在同一个浏览器中,我第一次访问,取到验证码图片,且值-{code:123}存入session。
2.同时我再打开一个页面,重复第一步骤,取到新的验证码图片,且值-{code:456}存入session。
3.这个时候,我在步骤1打开的页面中,看到图片为123,输入123,后台验证123不等于456。
pzx521521 发表于 2020-12-9 15:09
对验证码加地址/时间验证(甚至可以对时间/地址加密)
我第一次访问,取到验证码图片,且值-{time:'123' , c ...
嗯嗯,大概思路我明白了。相当于加了一个标识,通过标识我知道了哪个图片对应哪个session。{:1_893:} 都说的啥玩意儿。。。
行吧,不长篇大论说概念了,解释起来贼烦,自己百度。我只说 Session 的关键点:
①Session 的存储实现依赖于Cookie,Cookie 里面有个 SessionId,是你第一次请求的时候产生的,再次请求的时候,浏览器会带上这个SessionId,服务器会用这个SessionId来读取Session里面的value。就是说,这货是 key <==> value 模式。
举个栗子:
你做登录请求的场景。
你先请求了验证码(code=1234),服务器产生了一个key(SessionId),一个value(1234)。key会跟随请求回来,保存在Cookie里面,value也就是验证码,存在服务器Session池里。
你登录的时候,浏览器会带上Cookie,带上刚刚的key(SessionId)的请求去访问服务器,服务器就会用这个key获取value(验证码),如果key 还是刚刚那个key,那么value就会是刚刚的1234.
②同浏览器,同域名,Cookie 是共享的。你打开新的选项卡,用的还是同一个Cookie,同一个SessionId,同一个 key,这时候的所有操作都会影响到其他选项卡的请求结果。
然后来解答你的问题:
1.但是在同一个浏览器中,我第一次访问,取到验证码图片,且值-{code:123}存入session。 ==> 由①:服务器产生key 和 value,假设 key=abcde ,value=123 (验证码),key拿回到本地,验证码保存在服务器。这时在当前页面登录,浏览器会带着abcde去请求,可以取到 123。登录成功
2.同时我再打开一个页面,重复第一步骤,取到新的验证码图片,且值-{code:456}存入session。 ==> 由②:新操作,key(SessionId)还是刚刚的abcde,但是现在 value(Session) 变成 456 了, 456覆盖了123,所以这时候用原来的key(abcde)只能拿到新的456了。
3.这个时候,我在步骤1打开的页面中,看到图片为123,输入123,后台验证123不等于456。 ==> 由①和②:所以这时候,你到第一个选项卡去请求,跟在这个新选项卡请求,都是用同一个Cookie,都是带abcde去请求的,都是只能获取到 456.
对验证码加地址/时间验证(甚至可以对时间/地址加密)
我第一次访问,取到验证码图片,且值-{time:'123' , code:123}存入session。
重复第一步骤,取到新的验证码图片,且值-{time:'124' , code:456}存入session。
我在步骤1打开的页面中,看到图片为123,且知道time是123 输入123 验证成功 很简单,将单项,变成数组形式。以PHP为例:
session('code')=code;
用完之后,清空或注销就行了。 可以把验证码加上一些别的信息存入session reetin 发表于 2020-12-9 15:12
很简单,将单项,变成数组形式。以PHP为例:
session('code')=code;
用完之后,清空或注销就行了。
变成数组的话。
因为可以无限次去获取value的值,然后会存储多个value,然后如果是同一个key。
那很可能就匹配成功了呢。
所以二楼说的那种,再加标识,我觉得我可以试试。 本帖最后由 上官元恒 于 2020-12-9 16:51 编辑
session跟浏览器走的。因为session_id保存在cookies里。同一浏览器的同一站点cookies是通用的。也就是会被覆盖的。等同于刷新了验证码 零下八度 发表于 2020-12-9 17:27
都说的啥玩意儿。。。
行吧,不长篇大论说概念了,解释起来贼烦,自己百度。我只说 Session 的关键点:
...
在同一个浏览器是用着同一个session id。是这样吧。
那你看这个
https://blog.csdn.net/man20161217/article/details/87812628
他是用session判断锁定用户。原理有一点我不解,既然你说session是在一个浏览器内有一个id,那这样他把出错误用户存在session里,那岂不是他只知道当前浏览器的session id 用户。
如果这时 这个用户去其他的电脑、其他的浏览器去登录,是不是就取不到他已经被锁定的信息了。因为session id变了。
所以他这个锁定用户,只是锁定当前浏览器的当前用户,而不能锁定其他浏览器的当前用户。
是这样吧? 看不懂Java,简单看了下,这个文章跟Session没啥关系,关键应该是在“getServletContext”上,他每一次的存和取,都调用了 session.getServletContext() ,并不是直接存在 session 上的。
又百度了下 ServletContext 是个啥东西,发现这东西就是一个全局对象,而且是大家共享的对象,任何浏览器访问的都是同一个,
并且,作者用 username 来当 key ,这样一来,无论是在什么浏览器,只要输入了这个 username ,都能从这个唯一的Context里面能访问到存储的数据。
PS:这东西,我们一般存在Redis里面,用 UserId 做 key ,设置过期时间(比如30分钟),时间一到,Redis 会自动让存储的次数过期,重新计算。
页:
[1]
2