浅谈ASP.NET中Session实现的原理
Session其实是保存在服务器端的,关于用户个人信息的一个小容器,相当于在服务器端的内存中保存了一段信息,但是此信息不宜过大,否则客户端访问较多时会造成服务器内存不足!每个用户访问服务端时,服务端都会创建一个SessionID,并且将这个SessionID返回到客户端保存到浏览器的cookie中。当客户端再次请求服务时,服务器根据客户端传来的SessionID关联到此浏览器的用户对应的session信息。
1.首先我先建一个SessionManage类,用来管理Session:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
/// <summary>
///SessionManage 的摘要说明
/// </summary>
public class SessionManage
{
private static IDictionary<string, IDictionary<string, object>> data = new Dictionary<string, IDictionary<string, object>>();
public static IDictionary<string, object> GetSessionByID(string sessionID)
{
//判断泛型数据容器中是否存在这样的sessionID,如果有则返回session,没有的话则创建session(泛型容器),同事保存到泛型容器中。
//sessionID所对应的session其实也是一个泛型容器。
if (data.ContainsKey(sessionID))
{
return data[sessionID];
}
else
{
IDictionary<string, object> session = new Dictionary<string, object>();
data[sessionID] = session;//以传过来的SessionID创建一个Dictionary。
return session;
}
}
}
创建SessionTest.aspx,自定义表单元素,如下:
2.然后在用户访问的时候产生SessionID,创建Session空间,实际上是在服务器端的内存中分配存储与SessionID对应的session的空间。
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SessionTest.aspx.cs" Inherits="SessionTest" %>
<!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></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="lblMsg" runat="server"></asp:Label>
<br />
<asp:Button ID="btnSetSession" runat="server" Text="设置Session"
onclick="btnSetSession_Click" />
<asp:Button ID="btnReadSession" runat="server" Text="读取Session"
onclick="btnReadSession_Click" />
</div>
</form>
</body>
</html>
3.在SessionTest.aspx.cs中设置和读取session:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class SessionTest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//首次进入页面时
if (!Page.IsPostBack)
{
//判断是否从客户端传来mySessionID,如果没有在服务器端创建sessionID,并且返回客户端。
if (Request.Cookies["mySessionID"] == null)
{
string sessionID= Guid.NewGuid().ToString();//通过调用Guid.NewGuid()给客户端分配不同的session
Response.SetCookie(new HttpCookie("mySessionID", sessionID));
}
}
}
//设置session
protected void btnSetSession_Click(object sender, EventArgs e)
{
string sessionID = Request.Cookies["mySessionID"].Value;//读取客户端传来的sessionID
IDictionary<string,object> session = SessionManage.GetSessionByID(sessionID); //调用session管理器类的方法,返回一个session(实际上是个泛型容器)
//给session赋值
session["中国"] = "北京时间";
session["当前时间"] = DateTime.Now.ToString();
}
//读取session
protected void btnReadSession_Click(object sender, EventArgs e)
{
string sessionID = Request.Cookies["mySessionID"].Value;//读取客户端传来的sessionID
IDictionary<string,object> session = SessionManage.GetSessionByID(sessionID); //调用session管理器类的方法,返回一个session(实际上是个泛型容器)
//读取session
this.lblMsg.Text = session["中国"].ToString() + session["当前时间"].ToString();
}
}