• 浅谈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();
    }
    }

  • 相关阅读:
    前面的内容 也是要去掉白名单 和 8.8.8.8这种非问题IP的 高风险 么? (目前我们没有获取客户的中风险、低风险数据,可以处理掉高风险)
    大数据安全规范
    queue
    数据源、数据集、同步任务、数据仓库、元数据、数据目录、主题、来源系统、标签、增量识别字段、修改同步、ES索引、HBase列族、元数据同步、
    软件架构的5种视图
    软件各种系统架构图
    为何要建数据仓库 大数据下的企业数据仓库建设
    choorme 升级到最新版 adobe flash提示过期解决方案
    PowerShell控制台快捷键
    [Azure] 使用 Visual Studio 2013 管理中国版 Azure 订阅
  • 原文地址:https://www.cnblogs.com/dh616854836/p/2196111.html
Copyright © 2020-2023  润新知