我在这里有点困惑,构建一个具有标签表的 Web 应用程序。在选项卡表类中,我使用数据成员 - 静态字符串变量来存储用户选择的选项卡。我这样做是为了在用户返回选项卡表时显示用户最后选择的选项卡。我得到了理想的结果。但是,如果我注销并登录(在删除浏览器上的缓存之后),选项卡表仍在选择用户上次选择的选项卡,而不是选择默认选项卡。选项卡表正在由另一个组件初始化。我不明白的是,类定义不是垃圾收集吗?为什么要选择旧数据?如何解决这个问题?
4 回答
您似乎假设使变量静态以某种方式对应于将其隔离到用户会话。它没有。
如果你想要任何类型的会话处理,你实际上必须有一个 session。(您需要考虑服务器重启、多台服务器等发生的情况)
当您有一个静态变量时,它就是该类加载器中该类的一个变量。它与用户没有任何关系。如果所有用户访问同一台服务器,他们将看到相同的变量。
你没有告诉我们你使用什么技术来构建你的网络应用程序,但基本上你应该看看在服务器端用户会话方面为你提供了什么——或者使用隐藏字段或类似的东西传播信息,所以服务器根本不需要跟踪它。
静态成员是按类存储的,而不是按对象存储的,因此静态成员的值在所有类实例(对象)中是相同的,并且在实例超出范围时不会“重置”。以这种方式使用静态成员是一个坏主意,因为您的应用程序的所有用户都会看到相同的值,如果其中一个导致它发生更改,则更改后的值将对所有人可见(即,如果用户 1 更改选项卡,所有其他用户的选项卡也会更改)。
仅仅因为您清除了浏览器缓存,它不会影响服务器上存储静态变量的对象。如果用户注销(或登录,您的选择),您需要明确重新设置它
It's not static if the value is constantly changing. I think you should look at using a different mechanism to store these kinds of variables.