request.getSession()保存值成功,但是获取值是获取的上一次的值

request.getSession()保存值成功,但是获取值是获取的上一次的值
springboot2+redis+shrio项目,本地启动项目,在登陆的时候第一次验证码始终会失败,我打印输出语句之后发现一个问题,

我在生成验证码之后,就保存进request.getSession()中,然后再取出打印,这里是正确的;

但是我在登陆验证方法中校验这个验证码的时候 从request.getSession()中取出的又是上一次保存的验证码。

并且,我重新点击获取验证码之后重新登录又可以了

结题了,这个问题还是没有找到方法解决,我只有在登陆界面加载完成之后再刷新一次验证码。

“Devil组”引证GPT后的撰写:
这个问题可能是由于在获取验证码时,验证码保存在了浏览器的缓存中,而不是保存在后端的 session 中,导致第一次验证码验证失败。之后,当您再次获取验证码并保存到 session 中时,由于浏览器缓存中的验证码仍然存在,所以在您进行下一次验证码验证时,会从浏览器缓存中获取上一次的验证码,而不是从 session 中获取最新的验证码,因此导致验证失败。

解决这个问题可以尝试以下几个方案:

  • 将验证码保存到后端的 session 中,并在获取验证码时强制浏览器不缓存该请求的响应。可以在响应头中设置 Cache-Control、Pragma 等头部信息来实现。
  • 将验证码保存到后端的 Redis 缓存中,而不是 session 中。这种方式可以确保验证码的可靠性,并且可以方便地在多台服务器之间共享验证码。
  • 对于验证码生成的 URL,添加一个随机的查询参数,使浏览器认为每次请求的 URL 都不同,从而强制浏览器不缓存该请求的响应。例如,可以在验证码 URL 后添加一个类似于 ?timestamp=123456789 的参数。

小魔女参考了bing和GPT部分内容调写:
这个问题可能是由于session的超时时间导致的,当session超时时,之前保存的值就会失效,而登录验证方法中取出的就是上一次保存的值,所以会出现这样的情况。

解决方法就是设置session的超时时间,可以在application.properties中设置:

server.servlet.session.timeout=1800

设置session的超时时间为1800秒,这样就可以解决这个问题。
回答不易,记得采纳呀。