【发布时间】:2011-06-07 11:20:05
【问题描述】:
我正在开发一个网站,我想在会话超时后重定向到主页。 谁能帮我解决这个问题。
【问题讨论】:
标签: c# asp.net redirect session-timeout
我正在开发一个网站,我想在会话超时后重定向到主页。 谁能帮我解决这个问题。
【问题讨论】:
标签: c# asp.net redirect session-timeout
这是在 ASP.NET 中检测会话超时并重定向到登录页面的示例,当用户在 web.config 文件中指定的时间内处于空闲状态时会发生会话超时。
为此,我将 web.config 中的超时值设置为 1 分钟。
第一种方法
在 web.config 文件中,将 sessionstate 模式设置为 inproc,将身份验证模式设置为 Forms
<system.web>
<compilation debug="true"/>
<authentication mode="Forms"/>
<sessionState mode="InProc" cookieless="false" timeout="1"></sessionState>
</system.web>
我在这个例子中创建了三个页面,一个是登录页面,当会话到期时,我会重定向到这个页面,一个是导航页面,我将检查会话是否有效,如果它是有效的用户将看到这个页面,否则他会被重定向到登录页面。
在您的应用程序或网站的根目录中添加Global.asax 类文件。
仅当应用程序中存在Global.asax 时,此方法才有效。
在我们要检查会话超时的页面的 Page_Init 事件中编写下面提到的代码。
我们也可以将此代码放在一个类中,并从该类继承应用程序的所有页面,作为所有页面的基类,以检查会话超时。
C#代码
protected void Page_Init(object sender, EventArgs e)
{
if (Context.Session != null)
{
if (Session.IsNewSession)
{
HttpCookie newSessionIdCookie = Request.Cookies["ASP.NET_SessionId"];
if (newSessionIdCookie != null)
{
string newSessionIdCookieValue = newSessionIdCookie.Value;
if (newSessionIdCookieValue != string.Empty)
{
// This means Session was timed Out and New Session was started
Response.Redirect("Login.aspx");
}
}
}
}
}
第二种方法。
Default.aspx 的代码
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="btnSessionStart"
runat="server"
OnClick="btnSessionStart_Click"
Text="Start Session" /><br />
<br />
<br />
<asp:Button ID="btnCheck"
runat="server"
OnClick="btnCheck_Click"
Text="Check Session ID" />
<br />
<asp:TextBox ID="txtSession"
runat="server"
Width="266px">
</asp:TextBox><br />
<br />
<asp:Button ID="btnGO"
runat="server"
OnClick="btnGO_Click"
Text="Go to Other Page" />
<br />
<br />
</div>
</form>
</body>
</html>
这个页面背后的代码是这样的
protected void btnSessionStart_Click(object sender, EventArgs e)
{
Guid Session_id = Guid.NewGuid();
Session["SessionID"]
= Session_id.ToString();
}
protected void btnCheck_Click(object sender, EventArgs e)
{
if (Session["SessionID"] != null)
txtSession.Text =
Session["SessionID"].ToString();
else
txtSession.Text =
"Session has expired";
}
protected void btnGO_Click(object sender, EventArgs e)
{
Response.Redirect("Default2.aspx");
}
在我们要检查会话是否超时的页面上,我们需要在页面的 Page_Init 事件中检查它,如果会话不为空,则用户将能够访问该页面,否则他将被重定向到登录页面。
在这个页面我只是放了一个按钮去主页
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="btnHome"
runat="server" OnClick="btnHome_Click"
Text="Home" />
</div>
</form>
</body>
</html>
这个页面背后的代码是
protected void Page_Init(object sender, EventArgs e)
{
CheckSession();
}
protected void btnHome_Click(object sender, EventArgs e)
{
Response.Redirect("Default.aspx");
}
private void CheckSession()
{
if (Session["SessionID"] == null)
{
Response.Redirect("Login.aspx");
}
}
如果我们需要在应用程序的所有页面中检查这一点,我们可以创建一个 BaseClass 并编写上面提到的 CheckSession 和 Page_Init 部分的代码,并通过键入 BaseClassName 代替 System.Web 从该类中驱动所有页面。 UI.Page 每次加载页面时都会检查所有页面的会话超时
【讨论】: