zoukankan      html  css  js  c++  java
  • 【状态保持】会话状态Session解析以及原理分析

    我们知道web网站在客户端存储数据有三种形式:1. Cookie   2. hidden(隐藏域) 3.QueryString 其中viewstate什么的都是通过第二种方式隐藏域存储滴。

          客户端存储数据有三种形式,那服务器端有几种呢? 嘿嘿 服务器端有:1. Session 2. Application 3. database 4. caching(缓存) 其中session用的较多,当然数据库是必须的。

          好今天的主角是session,开发过管理系统项目(不限大小)的童鞋应该都接触过session,在管理系统中session最典型的应用就是当用户登录后在服务器端记录客户的唯一标示(比如用户名),然后再另外的页面中使用这个信息,当然也能判断用户是否登录后进入的系统,防止没有授权直接进入系统。

    先看一下怎么使用session吧

               //添加一个名为sessionTest的Session并且给他赋值
            Session["sessionTest"] = "test";
               //读取Session名为sessionTest的值
            Response.Write(Session["sessionTest"].ToString());

          1. 很简单吧!除了人为的创建session,还有就是当客户端浏览器访问一个站点的时候,服务端会自动创建一个session来存储客户端的信息,那么问题来了服务端不可能就一个客户端访问吧!会有成千上万的客户端访问它,那么问题又来了,服务端怎么区分不同的客户端呢?
          1.1 说到这就要引入一个新的名词了什么呢 ? 没错 sessionID,那么什么是sessionID呢?

          简单的说当客户端第一次访问某个站点的时候,将会在服务端生成一个唯一的Key,然后发送给客户端,在服务器端通过Key来取得相应的数据。通常,我们将这个key称为SessionID。

          1.2 大家都知道HTTP是无状态的,那么这个sessionID保存到客户端的什么地方呢?想想客户端“我们知道web网站在客户端存储数据有三种形式:1. Cookie   2. hidden(隐藏域) 3.QueryString”   ,这三个你觉得那个更有可能,没错是cookice,当然当客户端禁用cookice的情况先就会采用存储在QueryString中。

         2. 服务端的session

             2.1 在页面对象或者HttpContext对象中,都有一个名为Session的属性,在一次会话中,它们引用的都是同一个对象,定义如下

    public virtual HttpSessionState Session { get; }

                  在往上来看看HttpSessionState怎么定义的

    public sealed class HttpSessionState : ICollection, IEnumerable

                 2.1.1 从这个类中我们可以找到操作session 的一些方法,下面是一些常用的方法

    1 public void Abandon();
    2 public void Add(string name, object value);
    3 public void Clear();
    4 public void Remove(string name);
    5 
    6 public object this[int index] { get; set; }
    7 public object this[string name] { get; set; }

    从字面意思上就大概知道是什么方法,所以我就不一一解释了,看到6,7行可以知道session可以通过索引的方式访问。
                2.1.2 这个HttpSessionState来自于SessionStateModule。在每次请求处理过程中,HttpApplication在请求的处理管道中会检查当前请求的处理程序是否实现了接口IRequiresSessionState,如果实现了,那么SessionStateModule将为这个请求分配HttpSession。同时SessionModule还负责SessionID的生成  CookIeless会话管理。顺便提一下在使用一般处理程序的时候,默认情况下并没有实现这个接口,所以,如果在一般处理程序中使用Session必须实现IRequiresSessionState接口否则会导致异常。

          3. 客户端的SessionID
              第一次访问某站点的报文

          从相应报文中可以明显的看到服务端为客户端添加了一个Cookice,所以这个Cookice的值就为SessionID,还可以看到服务端并没有指定这个Cookice的过期时间所以这个Cookice会存储在内存中当浏览器关闭后,Cookice会立即消失。

         第二次访问

         从请求报文中很明显的看到,客户端想服务端发送了一个名为ASP.NET_SessionId的Cookice

  • 相关阅读:
    混合现实开发教程unity2017
    Intro to Airplane Physics in Unity 3D – 2017 and 2018
    Unity Awards 2018最佳资源
    ambiguous
    Unity2018.3全新Prefab预制件系统深入介绍视频教程+PPT+Demo源码
    Android Studio 集成开发工具教学视频 + 项目实战安卓多SDK接入与集成
    Unity下一轮最大的变革-Entity Component System & C# Jobs System
    使用unity开发游戏时如觉得游戏声音太吵,点Mute Audio
    SQL Delta实用案例介绍
    经典批处理实现自动关机(BAT)
  • 原文地址:https://www.cnblogs.com/wlitsoft/p/2488818.html
Copyright © 2011-2022 走看看