用ILSpy查看Session.SessionID的生成算法
缘由
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的生成算法的更多相关文章
- cookie,session,sessionid
cookie,session,sessionid http协议是无状态的,意思是每次请求的状态不会保存.因此,产生了cookie,session之类保存会话状态的机制.1.什么是cookiecooki ...
- STL_算法_04_算术和生成算法
◆ 常用的算术和生成算法: 1.1.求和( accumulate 是求和的意思)(对指定范围内的元素求和,然后结果再加上一个由val指定的初始值.) T accumulate(iteratorBegi ...
- roguelike地牢生成算法
文章原地址 上一个地图生成算法,这一次是一个地牢的生成算法,是一个国外的人写的算法,用dart语言写,我把它改成了unity-c#. 原作者博客地址:Rooms and Mazes: A Proced ...
- 美团技术分享:深度解密美团的分布式ID生成算法
本文来自美团技术团队“照东”的分享,原题<Leaf——美团点评分布式ID生成系统>,收录时有勘误.修订并重新排版,感谢原作者的分享. 1.引言 鉴于IM系统中聊天消息ID生成算法和生成策略 ...
- HttpContext.Current.Session.SessionID相关问题及备忘
今天Tony提到说我们系统中会利用如下代码来判断用户是否过期. if (string.IsNullOrEmpty(UserContext.ConnectionSessionId)) { LogUIFa ...
- 一个UUID生成算法的C语言实现 --- WIN32版本 .
一个UUID生成算法的C语言实现——WIN32版本 cheungmine 2007-9-16 根据定义,UUID(Universally Unique IDentifier,也称GUID)在时 ...
- 分布式全局不重复ID生成算法
分布式全局不重复ID生成算法 算法全局id唯一id 在分布式系统中经常会使用到生成全局唯一不重复ID的情况.本篇博客介绍生成的一些方法. 常见的一些方式: 1.通过DB做全局自增操作 优点:简单.高 ...
- C++ 基于凸包的Delaunay三角网生成算法
Delaunay三角网,写了用半天,调试BUG用了2天……醉了. 基本思路比较简单,但效率并不是很快. 1. 先生成一个凸包: 2. 只考虑凸包上的点,将凸包环切,生成一个三角网,暂时不考虑Delau ...
- C++ 凸包生成算法
由于我的极差记忆力,我打算把这个破玩意先记下来.因为以后会有改动(Delaunay三角网生成算法),我不想把一个好的东西改坏了... 好吧-- 凸包生成算法,: 1.先在指定的宽(width)高(he ...
随机推荐
- 打开gvim发现菜单栏是乱码
默认安装将会把中文区域设置为zh_CN.utf8,而GVim能识别的中文区域设置为zh_CN.UTF-8.因此GVim会在启动时报错,且 无法正常加载中文菜单.解决方案:Linux下编辑 ~/.vim ...
- ueditor工具栏新增按钮教程
我做了一个人博客网站想要一段文字高亮显示,大概是这样: 但是ueditor上面的代码语言是一大块的<pre></pre>标签,觉得不合适,就在网上搜索相关文章,自己结合着实现了 ...
- 换行的css属性
//正常换行 word-break:keep-all;word-wrap:normal; //下面这行是自动换行 word-break:break-all;word-wrap:break-word ...
- 使用vlc进行二次开发做自己的播放器
可参考: 使用vlc播放器做rtsp服务器 使用vlc播放器播放rtsp视频 web网页中使用vlc插件播放相机rtsp流视频 使用 https://github.com/ZeBobo5/Vlc.Do ...
- MongoDB【第一篇】MongodDB初识
NoSQL介绍 一.NoSQL简介 NoSQL,全称是”Not Only Sql”,指的是非关系型的数据库. 非关系型数据库主要有这些特点:非关系型的.分布式的.开源的.水平可扩展的. 原始的目的是为 ...
- 【转】C# 将字符串或表达式直接转为可执行代码的办法
C# 将字符串或表达式直接转为可执行代码的办法 反射类 using System; using System.Data; using System.Configuration; using Syste ...
- 前端应当了解的Web缓存知识
缓存优点 通常所说的Web缓存指的是可以自动保存常见http请求副本的http设备.对于前端开发者来说,浏览器充当了重要角色.除此外常见的还有各种各样的代理服务器也可以做缓存.当Web请求到达缓存时, ...
- 为什么我们拿Fork当收藏用
刚才看OSC源创会的视频,听到 @虫虫 说:中国人喜欢拿Fork当收藏用,这对硬盘是个很大的压力.我当时很认真地笑了笑.想想好像自己也Fork了一些东西啊. 是什么因素促使我去Fork一些东西呢?我大 ...
- iOS的一像素线
文/stark_yang(简书作者)原文链接:http://www.jianshu.com/p/b83dca88ef73著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 时常总结以前学过 ...
- java中File类的getPath(),getAbsolutePath(),getCanonicalPath()区别
File file = new File(".\\test.txt"); System.out.println(file.getPath()); System.out.printl ...