缘由

  asp.net Session在InProc模式下,容易丢失,经常需要重新登录,且不支持分布式共享。  

所以在研究Redis实现原生的Session,本来想用GUID作为key存入cookie,又在想能不能实现跟Session一样的id

实现

  ILSpy 是一个开源的.NET反编译工具,简洁强大易用是它的特征。在绝大多数情况下,它都能很好的完成你对未知程序集内部代码的探索。

ILSpy 下载地址:点击下载

  在VS中可以得知SessionID是System.Web.SessionState命名空间的HttpSessionState类下的属性。

在ILSpy中搜索HttpSessionState,找到Session属性,是IHttpSessionState接口对象创建的。

  查看HttpSessionState的构造函数,原来IHttpSessionState是从构造函数传过来的。

  本来是想通过搜索构造函数找到是哪传过来这个对象的,只是ILSpy只提供类型,成员,常量的搜索

折腾了好久,终于找到IHttpSessionState的接口实现类HttpSessionStateContainer

  DelayedGetSessionId方法

  CreateSessionId方法

  在追踪CreateSessionID方法,是个接口中定义的方法

  搜索CreateSessionID方法,找到具体的现实

  最后找到Create方法的所在类

测试

  具体的代码:

internal static class SessionId
{
internal const int NUM_CHARS_IN_ENCODING = ;
internal const int ENCODING_BITS_PER_CHAR = ;
internal const int ID_LENGTH_BITS = ;
internal const int ID_LENGTH_BYTES = ;
internal const int ID_LENGTH_CHARS = ;
private static char[] s_encoding;
private static bool[] s_legalchars;
internal static bool IsLegit(string s)
{
if (s == null || s.Length != )
{
return false;
}
bool result;
try
{
int num = ;
while (--num >= )
{
char c = s[num];
if (!SessionId.s_legalchars[(int)c])
{
result = false;
return result;
}
}
result = true;
}
catch (IndexOutOfRangeException)
{
result = false;
}
return result;
}
internal static string Create(ref RandomNumberGenerator randgen)
{
if (randgen == null)
{
randgen = new RNGCryptoServiceProvider();
}
byte[] array = new byte[];
randgen.GetBytes(array);
return SessionId.Encode(array);
}
static SessionId()
{
SessionId.s_encoding = new char[]
{
'a',
'b',
'c',
'd',
'e',
'f',
'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
'w',
'x',
'y',
'z',
'',
'',
'',
'',
'',
''
};
SessionId.s_legalchars = new bool[];
for (int i = SessionId.s_encoding.Length - ; i >= ; i--)
{
char c = SessionId.s_encoding[i];
SessionId.s_legalchars[(int)c] = true;
}
}
private static string Encode(byte[] buffer)
{
char[] array = new char[];
int num = ;
for (int i = ; i < ; i += )
{
int num2 = (int)buffer[i] | (int)buffer[i + ] << | (int)buffer[i + ] << | (int)buffer[i + ] << ;
int num3 = num2 & ;
array[num++] = SessionId.s_encoding[num3];
num3 = (num2 >> & );
array[num++] = SessionId.s_encoding[num3];
num3 = (num2 >> & );
array[num++] = SessionId.s_encoding[num3];
num3 = (num2 >> & );
array[num++] = SessionId.s_encoding[num3];
num3 = (num2 >> & );
array[num++] = SessionId.s_encoding[num3];
num3 = (num2 >> & );
array[num++] = SessionId.s_encoding[num3];
num2 = ((num2 >> & ) | (int)buffer[i + ] << );
num3 = (num2 & );
array[num++] = SessionId.s_encoding[num3];
num3 = (num2 >> & );
array[num++] = SessionId.s_encoding[num3];
}
return new string(array);
}
}

  调用:

 public partial class Contact : Page
{ protected void Page_Load(object sender, EventArgs e)
{
string SessionId = CreateSessionID(Context);
Response.Write(SessionId+"<br/>");
       Response.Write(Session.SessionID);
Response.End();
} private RandomNumberGenerator _randgen;
public virtual string CreateSessionID(HttpContext context)
{ return SessionId.Create(ref this._randgen);
} }

效果截图:

用ILSpy查看Session.SessionID的生成算法的更多相关文章

  1. cookie,session,sessionid

    cookie,session,sessionid http协议是无状态的,意思是每次请求的状态不会保存.因此,产生了cookie,session之类保存会话状态的机制.1.什么是cookiecooki ...

  2. STL_算法_04_算术和生成算法

    ◆ 常用的算术和生成算法: 1.1.求和( accumulate 是求和的意思)(对指定范围内的元素求和,然后结果再加上一个由val指定的初始值.) T accumulate(iteratorBegi ...

  3. roguelike地牢生成算法

    文章原地址 上一个地图生成算法,这一次是一个地牢的生成算法,是一个国外的人写的算法,用dart语言写,我把它改成了unity-c#. 原作者博客地址:Rooms and Mazes: A Proced ...

  4. 美团技术分享:深度解密美团的分布式ID生成算法

    本文来自美团技术团队“照东”的分享,原题<Leaf——美团点评分布式ID生成系统>,收录时有勘误.修订并重新排版,感谢原作者的分享. 1.引言 鉴于IM系统中聊天消息ID生成算法和生成策略 ...

  5. HttpContext.Current.Session.SessionID相关问题及备忘

    今天Tony提到说我们系统中会利用如下代码来判断用户是否过期. if (string.IsNullOrEmpty(UserContext.ConnectionSessionId)) { LogUIFa ...

  6. 一个UUID生成算法的C语言实现 --- WIN32版本 .

    一个UUID生成算法的C语言实现——WIN32版本   cheungmine 2007-9-16   根据定义,UUID(Universally Unique IDentifier,也称GUID)在时 ...

  7. 分布式全局不重复ID生成算法

    分布式全局不重复ID生成算法 算法全局id唯一id  在分布式系统中经常会使用到生成全局唯一不重复ID的情况.本篇博客介绍生成的一些方法. 常见的一些方式: 1.通过DB做全局自增操作 优点:简单.高 ...

  8. C++ 基于凸包的Delaunay三角网生成算法

    Delaunay三角网,写了用半天,调试BUG用了2天……醉了. 基本思路比较简单,但效率并不是很快. 1. 先生成一个凸包: 2. 只考虑凸包上的点,将凸包环切,生成一个三角网,暂时不考虑Delau ...

  9. C++ 凸包生成算法

    由于我的极差记忆力,我打算把这个破玩意先记下来.因为以后会有改动(Delaunay三角网生成算法),我不想把一个好的东西改坏了... 好吧-- 凸包生成算法,: 1.先在指定的宽(width)高(he ...

随机推荐

  1. Python Day11

    RabbitMQ队列 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列 ...

  2. ubuntu下非root用户下获得使用wireshark的权限

    在非root用户下不能使用wireshark用来抓包,所以需要进行以下操作: sudo groupadd wireshark sudo chgrp wireshark /usr/bin/dumpcap ...

  3. docker run mysql

    sudo docker run --name=mysqlserver -e MYSQL_ROOT_PASS=123456 -v /srv/mysql/data:/data/mysql -d -p : ...

  4. iOS 10、Xcode 8 遇到部分问题解决记录

    今天把iphone 6 升级到ios10 后,用Xcode 7进行真机调试的时候提示: Could not find Developer Disk Image 果断准备升级到Xcode 8 .但是想保 ...

  5. Android中Context的理解及使用(一)——Context的作用

    Context的作用:用来访问全局信息的接口,通过Context进行资源的访问. 1.Context获取字符串资源: public class MainActivity extends AppComp ...

  6. R语言——绘制半圆形图

    好久没发点新的作品了.......也许...... Que sera, seraWhatever will be, will be

  7. TCP学习之二:客户端与服务端的连接

    主要参考张子阳大神的博客:http://www.cnblogs.com/JimmyZhang/category/101698.html TcpClient是对Socket的封装 一个TcpClient ...

  8. 关于setInterval()你所不知道的地方

    前言:1.使用setInterval()的定时器会把事件运行的时间也包含在内,如果要精确算定时两个任务之间的时间,可以使用setTimeout()替换.2.当异步事件发生时,如mouse click, ...

  9. 如何在ARM中创建Express Route

    很早之前就想试试Azure的express route,但是一直没有找到合适的机会,正好有个客户需要上express route,所以最近先自己研究研究,防止在做poc的时候耗费更多时间,本次场景我们 ...

  10. mysql导出部分表数据

    mysqldump -uroot -p -h 192.168.1.11 -P 3306 mojiarticle UID_IMEI --where "ID > 1021230 and I ...