用MVC做的程序,写了个BaseController 所有Controller都继承了这个BaseController ,BaseController 里面重写了OnActionExecuting方法,这里面去判断session 是否为空,为空跳转到登录页面。登录成功后直接用session["loguser"]=这样赋值的。
现在出现了A登录后 查看到的信息是B的或者C的,只在浏览器登录了 并没有登录过B或者C,请问各位大佬,这个是怎么回事,该怎么解决呢?非常感谢!!!
那你登录b的话,登录信息正确不?
不是的,abc 是不同的用户,不在同一电脑
正式环境,还是开发环境。使用httpcontext的session吗
@保镖: 正式环境,开发环境下一切正常,正式环境下 在用户少的时候也正常。 session 直接在controller 里面 session["userInfo"] 这么写的
@林中鸟@: 我没遇到过混乱的这种情况,会不会被某处代码篡改了,比如session[a]=c。 不建议在代码中直接session["userInfo"] ,最好封装成方法。
@保镖: 用户少的情况下还是正常的,就是并发多了 就这德行了。。。
@林中鸟@: 多大并发?不应出现这种情况吧
@保镖:应该也就几百
@林中鸟@: 纯并发,还是在线?我做过1000在线的项目,没遇到过混乱情况。
@保镖: 在线,你用的也是session吗?
@林中鸟@: 对呀,就是session["user"]
@保镖: 那太尴尬了。。。。
@保镖: 没别的好办法 就只能换无状态那种了,,,
@林中鸟@: 我建议你把用户id存在cookies里,在OnActionExecuting时,判断session存在登录信息的用户id何时变化了,然后分析日志,是不是那个动作导致的。
@林中鸟@: 你sessionState mode="InProc",还是<sessionState mode="StateServer"
@保镖: InProc 是这个
@林中鸟@: <sessionState mode="StateServer"改成这个试试吧,用它保存session相对稳定。我以前用InProc,总是丢session,用StateServer不怎么丢了。不知道能不能解决你的问题。
你用没用比如session[user]搜索你整个项目代码,看看有没有被哪个动作把session篡改了,我还是怀疑你session被篡改了。
@保镖: 那我先改成stateServer试试, 其他地方确实没有这了。。。
@林中鸟@: 问题解决了?
等着结果呢,咋没了
你这个是单体应用还是说配置了负载均衡啊?
如果是有负载均衡的话,你得把session存到redis上面,不然的话肯定是会混乱的。
sessionid默认算法是有几率碰撞的,前提是量特别大
首先得排除业务代码的bug导致的这种情况
如果不是代码bug的话,得重写sessionid的生成算法