zoukankan      html  css  js  c++  java
  • 浅谈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();
    }
    }

  • 相关阅读:
    Tomcat windows服务器配置多个Tomcat
    Sharepoint开发实用技巧(1)
    戏说MOSS关于EventHander编程
    协作应用程序标记语言 CAML 点滴(一)
    MOSS开发手记(3)
    协作应用程序标记语言 CAML点滴(二)
    MOSS项目开发(1) 项目计划,重点及文档
    MOSS项目开发(4) 开发文档的规范
    MOSS开发手记(2)
    Asp.Net页面执行流程分析
  • 原文地址:https://www.cnblogs.com/dh616854836/p/2196111.html
Copyright © 2011-2022 走看看