题
当会话过期时,我的应用程序会抛出错误。
我不希望会话自动过期......
但如果没有办法做到这一点,那么应该将其重定向到登录页面,而不是显示错误......
我尝试这样做......
Response.AppendHeader("Refresh", Convert.ToString((Session.Timeout * 60) + 10) + "; URL=Login.aspx");
当会话过期时此代码不起作用..我收到一条错误消息
在这种情况下无法做出响应。
网络配置有这个
<authentication mode="Forms">
<forms loginUrl="Login.aspx" name="Cookie" timeout="10080" path="/">
</forms>
</authentication>
<authorization>
<deny users="?"/>
<allow users="*"/>
</authorization>
我还需要在网络配置中添加其他内容吗...
有什么建议...谢谢
这是我的页面加载
protected void Page_Load(object sender, EventArgs e)
{
Response.AppendHeader("Refresh", Convert.ToString((Session.Timeout * 60) + 10) + "; URL=Login.aspx");
string userName = Session["userName"].ToString();
string password = Session["password"].ToString();
string domain = Session["domain"].ToString();
impersonateValidUser(userName, domain, password);
}
解决方案
我已在主页的 Page_Load
中解决了这个问题。
每次 Page_Load
触发时,它都会检查是否存在特定的 Session
值(如果用户已正确登录,则该值应存在)。如果没有,我会重定向到登录页面。
例如:
// Assuming your using master pages (if not you could have this in a base page that all
// your pages inherit from.
protected void Page_Load(object sender, EventArgs e)
{
if (Session["SomeKey"] == null)
{
// Session has expired or person has not signed in so redirect.
FormsAuthentication.SignOut();
Session.Abandon();
Response.Redirect("signin.aspx", true);
}
// If all is good continue and do whatever you normally do.
}
在您的示例中,由于会话过期,会话变量可能不存在,因此您从所有获取的会话密钥中返回null。您应该验证它们不是null,如果这样做,则对值为null的情况做出适当的反应。
其他提示
您可以做的就是向您的页面添加一个不可见的 iframe:
<iframe src="keepalive.aspx" style="width:0px;height:0px"></iframe>
keepalive.aspx 包含以下内容:
<%@ Page Language="C#" Inherits="Keepalive" EnableSessionState="True"%>
<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" >
<html>
<head>
<META http-equiv="refresh" content="60"/>
</head>
<body></body>
</html>
每 60 秒 keepalive.aspx 会自行刷新一次,从而使会话保持活动状态。您可以将会话超时设置为例如 2 分钟。这样,在用户离开您的页面后,会话将很快被清理。
在您的网站上建立永久会话是一个坏主意,但您可以通过在web.config中为会话超时提供大值来实现此目的
<sessionState timeout="6000"/>
不隶属于 StackOverflow