为何一次请求产生了两个sesssion?

如题, 在进行登录时,总是提示服务器发生异常,在昨天的时候登录都还可以用的,后来发现是因为从session中获取保存的验证码是空的,可是我在获取验证码的时候明明有存入session的,于是打断点发现在获取验证码的时候获取的和在进行登录时获取的session是两个不同的session....后来通过会话监听发现服务器创建了两个不同的session,在项目启动后第一次访问首页地址时服务器创建了第一个session,由于首页上有登录界面,在向服务器获取验证码的时候又创建了一个session,请问为什么会这样呢?以及解决方案是什么呢?

image.png

第一次获取验证码:image.png

访问首页的同时创建第一个session:

image.png

image.png

获取验证码时创建了第二个session:

image.png

image.png

创建的两个session如下:

image.png

这两个会话同时存在,且在获取验证码时获取的是一个session,在进行登录请求时获取的是另一个session,很疑惑...为什么会这样呢?。。@JFinal

评论区

JFinal

2017-09-21 10:18

这个决然与 jfinal 无关了,jfinal 从来不干预 session 的生成与销毁

如果使用的是 tomcat,那很可能是跳到这个坑里了:
https://my.oschina.net/jfinal/blog/353062

arboret

2017-09-21 10:24

@JFinal 不是,用的是Jetty,不过刚刚查资料看到有人说用ajax发送异步请求每次获取的session都不一样,同步请求就没这个问题。登录操作我是发送的异步请求,于是我刚刚用session.isNew()调试了下,发现每次点击登录获取的session真的都不一样...为什么会这样呢?

JFinal

2017-09-21 10:32

只要知道 session 实现机制就明白了,session 利用 cookie 在客户端存放了一个类似于 token 值的东东,每次要创建 session 之前,服务端会先获取session 对应的 cookie 是否存在,如果存在则去找已经建好的 session 对象,否则,就新建一个。

而 ajax 发送异常请求应该是没在这个请求中带上 cookie 值,所以服务端得不到 session 所对应的 cookie 值,利用 cookie 去找 session 也就无从谈起

检验方法极其简单,下面方法二选一:
1:发送 ajax 请求到服务端的代码,利用 getCookie()看是否有 session 对应的 cookie 被传送过来
2:在 chrome 浏览器中按 F12,监测请求中的 cookie 值

arboret

2017-09-27 15:15

@JFinal 好的,谢谢波总~这个问题找到了,是因为我在系统中配置的访问地址是127.0.0.1,但在浏览器中访问的是localhost,统一使用其中一个后就不会出现这个问题。

热门反馈

扫码入社