java web很诡异的问题,求助!

massjcy 发布于 2015/07/12 11:12
阅读 574
收藏 0

实验室有一个javaweb项目,目前在测试使用,遇到了一个奇怪的现象:10个不同的账户同时登陆,过一段时间,其中的一个用户在查看自己信息的时候发现自己的信息变成另外9个账户中的一个了,感觉好奇怪!各位大神有没有遇到过这种情况的?

项目语言:java,jsp,html,js,css

框架:struts2,hibernate3,spring3

数据库:mysql5.5

服务器软件:tomcat7.0

jdk:1.7

加载中
0
八一菜刀
八一菜刀
session会话保存用户的代码有问题
0
tnjin
tnjin
你在读取用户信息的时候,没有验证用户是否和登录信息一致
m
massjcy
这个怎么验证啊?我在程序里是这样写的:Login login = (Login) (ActionContext.getContext().getSession().get("login"));
0
m
massjcy

引用来自“八一菜刀”的评论

session会话保存用户的代码有问题
如果用户登录成功,则将登录信息保存到session,我的代码是这样的:ActionContext.getContext().getSession().put("login", login);,使用的是struts2的保存会话的机制,以下是更详细的代码
if(result)
{//登录验证成功
login = loginService.getCrewInformation(username, password);
ActionContext.getContext().getSession().put("login", login);
}
0
LucEsape
LucEsape
你保存时session里要有用户唯一识别字段。另外同一浏览器打开多窗口 session会有共享问题。
LucEsape
LucEsape
回复 @massjcy : 你把spring的配置 和你的action代码贴上来
m
massjcy
回复 @隔壁老鱼 : login是用户的基本信息,有用户的姓名,性别,班级,年级等信息。user是key值,每一个用户登陆之后user是相同的,login的内容是不同的
LucEsape
LucEsape
你放的login是表示不同用户的唯一识别码吗?还是只是表示登入状态
m
massjcy
我是这样放session的:ActionContext.getContext().getSession().put("user", login); 你说的唯一识别字段是指put的时候,user要每一个用户都一样是吗?可是我见别人写的代码都是这样写的。 同一浏览器打开多窗口会共享session这个我知道,我当时是用10个用户,在不同的电脑上操作的,用户名都不相同
0
泥瓦匠BYSocket
泥瓦匠BYSocket
首先测试 保证是多个客户端(比如多个浏览器)

再者是代码问题
ActionContext.getContext().getSession().put("login", login);
getSession()是获取该用户唯一标识的对象可以看看
http://my.oschina.net/jeffli1993/blog/477535
代码应该没多大问题。

泥瓦匠BYSocket
泥瓦匠BYSocket
回复 @massjcy : 没真相啊
m
massjcy
回复 @泥沙砖瓦浆木匠 : 是局域网,用同一个路由器接入网络,服务器是局域网内的一台主机,其他的客户端是局域网内的其他电脑,使用http://192.168.0.XXX:8080/projectName访问服务器的项目。
泥瓦匠BYSocket
泥瓦匠BYSocket
回复 @massjcy : 局域网?
泥瓦匠BYSocket
泥瓦匠BYSocket
回复 @massjcy : 服务器放哪里?
m
massjcy
我不仅是多个浏览器了,是多个人在不同的电脑上操作,这种情况只是偶尔出现,没有规律!
0
当C罗爱上梅西
当C罗爱上梅西
出现并发了,请检查是否将Action设置成了单实例的。Struts2的Action要设置成原型的。
m
massjcy
是吗?是这个原因????我前两天才看出来,因为是别人写的这部分代码,我修改了一下,但是不知道是不是这个原因导致的?我之前也想过是这个原因,如果action是单例的,那我获取用户信息的时候是通过ActionContext.getContext().getSession().get("login"),这个没有涉及到公共变量的引用啊?所以想不通!求解释!谢谢!
0
尚浩宇
尚浩宇
Struts2每次请求时,有一个单独的过滤器会把request、session等信息保存到一个map里并传递到ActionContext类中,ActionContext类内部有一个静态的ThreadLocal域,也就是说每个线程都会有一个私有的Context全局属性。应该知道单例是线程安全的,不会出现错乱的现象。而如果action非单例,那么就存在一个资源竞争的问题,每次请求创建一个action对象,当并发访问时,有可能会存在两个action对象共享一个ThreadLocal中的ActionContext
0
丌官尚雄
丌官尚雄

这个问题的来源肯定是session,同样问题的还有,你永通一个浏览器登录两个不同的腾讯账号,过一会儿刷新看看,所有的账号都显示成最后一个账号了。


返回顶部
顶部