• session


    Cookie不能存储过多信息。如果想保存大量的数据,以保存一个Guid到Cookie中,然后在服务器中建立一个以Guid为Key,复杂数据为Value全局Dictionary。static段对于不同用户也只有一份,因此用static实现多用户共享数据。

    一、session是怎么存储,提取的?

     
    1.在服务器端有一个session池,用来存储每个用户提交session中的数据,Session对于每一个客户端(或者说浏览器实例)是“人手一份”,用户首次与Web服务器建立连接的时候,服务器会给用户分发一个SessionID作为标识。SessionID是一个由24个字符组成的随机字符串。用户每次提交页面,浏览器都会把这个SessionID包含在HTTP头中提交给Web服务器,这样Web服务器就能区分当前请求页面的是哪一个客户端,而这个SessionID是一cookie的方式保存的在客户端的内存中的,如果想要得到Session池中的数据,服务器就会根据客户端提交的唯一SessionID标识给出相应的数据返回。
     
    2.输入正确的账号密码,点击登录,页面就会输出  “admin --- 点击登录”
     

    二、Session池中每个客户端的数据 是怎么存储的?

     
    1.存储在Session池中的数据是全局型的数据,可以跨页面访问,每个SessionID中只存储唯一的数据,如:首先你这样设定:session["userName"]="admin",然后你在会话还没结束的session还没过期的情况下,你又设定:session["userName"]="123";这样这个SessionID没变,然而Session池中的数据则被覆盖。此时session["userName"]的值就是“123”,而不是其它。
    2.Session池中的数据不能跨进程访问。如:打开login.aspx页面写入session[“userName”]="admin";然后login页面不关闭,即此会话不结束,在这是你再在另外一个浏览器中打开一个login.aspx页面则session["userName"]=null
     
    3.输入账号密码,点击登录页面输出  “admin --- 点击登录” ,如果紧接着点击获取session按钮,则页面只输出"admin--- 点击获取session",如果页面不关闭,打开另外一个浏览器,点击获取session按钮,则页面没法应。
     

    三丶session的声明周期与销毁

     
    1.session存储数据计时是滚动计时方式。具体是这样的,如果你打开写入session,从写入开始,此页面如果一直没有提交操作,则默认时间是20分钟,20分钟后session被服务器自动销毁,如过有提交操作,服务器会从提交后重新计时以此类推,直至设定时间内销毁。
     
    2.可以设置session的销毁时间。上面代码有提到。
     

    四丶session中保存的数据是在服务端的

    每个用户如进行登录操作,都要进行session数据写入,所以建议慎用session,就是少用。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    public class MgrSession
    {
        private static IDictionary <string, IDictionary<string object>> data = new Dictionary<string , IDictionary< stringobject >>();
     
        public static IDictionary <stringobject> MgrSessionGet(string sessionID)
        {
            if (data.ContainsKey(sessionID))//有的话就返回,这里是类的传引用
            {
                return data[sessionID];
            }
            else
            {
                IDictionary<string object> session = new Dictionary <stringobject>();
                data[sessionID] = session;
                return session;//这里也是类的传引用
            }
        }
    }
     
     
    public partial class testSession : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Request.Cookies["MysessionId" ] == null)
            {
                string id = Guid .NewGuid().ToString();
                Response.SetCookie( new HttpCookie ("MysessionId", id));
            }
        }
        protected void Button1_Click(object sender, EventArgs e) //设置Session
        {
            string sessionId = Convert .ToString(Request.Cookies["MysessionId"]);
            IDictionary<string object> session = MgrSession.MgrSessionGet(sessionId);//无论有没有都会返回一个key为“sessionId”的传引用
            session[ "设置服务器" ] = "33333";
        }
        protected void Button2_Click(object sender, EventArgs e) //获取Session
        {
            string sessionId = Convert .ToString(Request.Cookies["MysessionId"]);
            IDictionary<string object> session = MgrSession.MgrSessionGet(sessionId);//无论有没有都会返回一个key为“sessionId”的传引用
            Button2.Text = Convert.ToString(session["设置服务器" ]);
        }
    }
  • 相关阅读:
    JUC回顾之-可重入的互斥锁ReentrantLock
    java基础知识回顾之java Thread类学习(十二)-- 线程中断
    mknod命令
    一个公益水塘引发的纠纷
    对cgic的理解——name选项
    linux的fwrite()使用方法,当前时间写入文本的程序
    /etc/resolv.conf文件详解
    关于函数strtok和strtok_r的使用要点和实现原理
    shell视频
    进程一些命令pstree,ps,pstack,top
  • 原文地址:https://www.cnblogs.com/zhxshseu/p/5292159.html
Copyright © 2020-2023  润新知