2

我正在开发一个应用程序,我们在会话中保存一些成员(未登录的用户)信息。

该特定 ID 用于收款和做其他事情。但是,当我打开该应用程序的两个选项卡或该应用程序的两个窗口时;成员的会话 ID 不匹配。当前选项卡获取打开的辅助选项卡的 ID。

我请求一些指导/帮助。

我正在使用以下代码:

public static object GetSessionValue(string sessionName) {
    if (HttpContext.Current.Session[sessionName] == null) {
        return null;
    } else {
        return HttpContext.Current.Session[sessionName];
    }
}

public static void SetSessionValue(string sessionName, object sessionValue) {
    HttpContext.Current.Session[sessionName] = sessionValue;
}
4

3 回答 3

0

在同一浏览器中打开的所有选项卡在服务器端共享同一个 ASP 会话。因此,一般的解决方案是在网页(浏览器选项卡)本身中嵌入足够的信息,以便可以使用来自它的回发从共享会话中检索适当的对话。

换句话说,在页面内的隐藏字段中写入一些键值,这些键值将作为回发请求的一部分发回,以区分每个浏览器选项卡。明智地使用页面的 ASP视图状态可以处理很多这样的问题。我相信您也可以强制对视图状态值进行加密。

或者,您可以自己使用随机密钥对隐藏字段进行编码,该密钥可用于检索您保存在会话缓存中的数据。但是,这种方法更难正确执行,因为如果用户关闭他的选项卡或浏览器,您确实需要从会话中删除旧的(过期的)密钥。

例如,我有一个在固定长度页面中显示数据列表的 Web 应用程序。由于我希望用户能够同时打开多个列表,每个列表在单独的浏览器选项卡中,我将当前的分页信息(页码、列表号等)嵌入到 HTML 页面的隐藏字段中。然后,我在回发时读取这些隐藏字段值,以恢复执行回发的特定浏览器选项卡的正确分页上下文。

于 2013-07-31T20:23:04.510 回答
0

Session对象用于共享给定浏览器上一系列页面加载的状态。这非常适合存储用户登录的信息以及用户拥有的权限等信息,因为每次加载页面时,浏览器背后都是同一个人(AKA 用户)。

您描述的问题是您希望同一浏览器的两个选项卡显示不同的状态,即如果选项卡 1 在主页上,而选项卡 2 在帐户页面上,您不希望选项卡 2 刷新以加载主页,您想要它留在帐户页面上。这是页面级状态,而不是用户级状态,因此您不应将信息存储在 Session 中。

如果您使用 WebForms(.aspx 页面)来运行您的站点,您应该查看MSDN 上的 ViewState。如果您使用 MVC,您应该考虑使用 javascript 和 AJAX 来更新页面并将页面的状态存储在客户端的 js 变量中。

于 2013-07-31T20:04:40.530 回答
0

但是,当我打开该应用程序的两个选项卡或该应用程序的两个窗口时;成员的会话 ID 不匹配。当前选项卡获取打开的辅助选项卡的 ID。

如果您在浏览器的两个不同选项卡中打开同一个网站,它们将共享会话。这是设计使然。

你可以复制它。登录 bankofamerican.com,打开一个新标签并粘贴https://secure.bankofamerica.com/transfers/funds-transfer.go 注意您不需要登录。

但是,如果您将 url 粘贴到新的浏览器窗口中(登录一个浏览器窗口时 -必须是相同类型的浏览器),它们会共享会话。

于 2013-07-31T16:53:00.840 回答