当用户浏览我的网站时,我最初使用静态变量来存储一些用户信息。我遇到的问题是,有时用户会导航到某个地方,并在页面上看到另一个用户名。我改用会话变量来解决此问题,但是发生了同样的问题。然后我认为以某种方式使会话变量名称唯一可以解决问题,例如代替
Session["userId"]
我更改了所有会话变量,以在创建和引用它们时附加用户的唯一用户名,因此它们是:
Session["userId" + Context.Identity.User.Name.ToString()]
到目前为止,我还没有关于该问题的报告,但这实际上可以工作吗?有没有一种简单的方法来保护会话,以免变量在用户之间泄漏?我对ASP.NET
代码(特别是webforms
)很有信心,但是随着更多用户使用该站点,我才遇到会话问题。由于该网站是通过AWS Elastic Beanstalk
构建的,因此我对IIS设置没有太多控制权,因此它大部分是默认的IIS设置。
答案 0 :(得分:1)
这应该可以正常工作,但是我建议将用户名或用户配置文件信息存储在cookie或本地存储中,因为正如您提到的,当许多用户登录时,它们会在服务器内存上为他们维护会话(我相信默认情况下会话是内存中的)不是进行中或Redis)。这是不可扩展的,就像数百万用户登录或您创建负载测试服务器一样,会话管理将占用大量内存。但是,几百个用户并没有太多开销。
您可以使用sessionStorage将信息存储在用户浏览器中,例如:
设置值
sessionStorage.setItem("user_name", "test");
获得价值
var userName = sessionStorage.getItem("user_name");
它也可以存储javascript对象或json。
Cookie是在用户端存储信息的旧方法:
创建cookie
document.userCookie = "username=John Doe";
读取cookie
document.userCookie //"username=John Doe"
表单身份验证还提供加密和安全的cookie,该cookie与会话一起维护,如果用户个人资料信息是敏感数据,也很好。
答案 1 :(得分:0)
对不起,我无法为您的问题写评论,但是: 使用AWS Elastic Beanstalk对Java开发人员也存在相同的问题: https://forums.aws.amazon.com/thread.jspa?threadID=84027 首先,我建议您尝试为HttpResponse(临时解决方案)设置无缓存,然后 我建议您尝试使用IIS代理设置。
如果没有帮助(并且您正在使用负载平衡器),请拒绝使用inproc设置,如本主题中所示: User on wrong session
PS。您真的不必使会话变量名称不同-ASP.NET为每个会话设置不同的Session_ID来保证会话唯一性。