我在asp.net中有一个带登录选项的网站。
如果我在两个浏览器选项卡中打开网站并使用相同的用户帐户登录并导航到两个选项卡中的主屏幕,现在我从一个选项卡注销并再次登录到同一选项卡,之后我点击了第二个选项卡,
我怎么能歧视我从第一个标签或第二个标签发送请求?
如果请求来自第二个标签,我需要将应用程序导航到登录屏幕。我该怎么做?
在我的主页中,我添加了像
这样的逻辑if (Session["UserID"] == null)
{
Response.Redirect("Login.aspx");
}
但问题是,当我从第一个选项卡注销并再次登录时,在第二个选项卡刷新后,Session [“UserID”]不为空,因此它将保留在那里。但我需要重定向登录页面.how我能实现这个吗?
答案 0 :(得分:6)
我建议您使用 JavaScript 和 Ajax Post 进行重定向。我自己使用它,发现它可靠,满足需要。我仍然认为可能有更好的方法来做到这一点。但是现在这将完成你的工作。
下面的代码检查标签焦点/焦点丢失,并在模糊和焦点上调用Csharp代码。
private var arrayAssocationKey: String?
extension NSArray {
var ID: String? {
get {
return objc_getAssociatedObject(self, &arrayAssocationKey) as? String
}
set {
objc_setAssociatedObject(self, &arrayAssocationKey, newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_COPY))
}
}
}
var array = NSArray()
array.ID = "5"
println(array.ID)
在Code后面添加此方法:(记得添加 <script type="text/javascript">
//divClearMessages
$(window).on("blur focus", function (e) {
var prevType = $(this).data("prevType");
if (prevType != e.type) { // script for Please Come Back
switch (e.type) {
case "blur":
// Use this if you want to check something after user changes tab
case "focus":
$.ajax({
type: "POST",
url: "main.aspx/CheckIfSessionIsNull", // Call here the Csharp method which checks the session and redirect user
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (retValue) {
// Do something with the return value from.Net method
}
});
break;
}
}
$(this).data("prevType", e.type);
})
</script>
属性)
[WebMethod]
答案 1 :(得分:5)
基本上您的问题是属于同一浏览器进程的选项卡共享cookie,因此每个选项卡都使用相同的会话和会话cookie。
您可以通过将会话Cookie关闭为documented on MSDN来解决此问题:
<configuration>
<system.web>
<sessionState cookieless="true"
regenerateExpiredSessionId="true" />
</system.web>
</configuration>
ASP.NET通过自动在页面的URL中插入唯一的会话ID来维护无Cookie会话状态。
每个新标签访问没有会话ID的网址都会启动新会话。
或者,您可以在初始页面加载事件中生成一些唯一ID,并通过将它们包装在类中并将该类的实例存储在会话内的新ID下来存储/检索会话变量。