缘由

  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. maven log4g 用法

    <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> & ...

  2. 《SQL必知必会》学习笔记(一)

    这两天看了<SQL必知必会>第四版这本书,并照着书上做了不少实验,也对以前的概念有得新的认识,也发现以前自己有得地方理解错了.我采用的数据库是SQL Server2012.数据库中有一张比 ...

  3. Linux下按程序查实时流量 network traffic

    实然看到下载速度多达几M/s,但实际上并没有什么占用带宽的进程. 相查看每个程序占用的网络流量, 但系统自带的 System Monitor 只能查看全局的流量, 不能具体看某个程序的...... k ...

  4. 轮播插件unsilder 源码解析(一)---使用

    啰嗦几句:学习的可以直接省略,一直本着写原生的插件想法,但是前天看了吕大豹的博客觉得自己都没有正经的写个jquery插件:所以在开始写之前我会先对几个比较热门的jquery的插件进行源码分析:至于为什 ...

  5. windows系统如何添加ssh key到github

    我自己的电脑安装了git后,从来没有用过,今天偶然用了一次,发现不能pull到东西,报错说我没有权限,于是我网上搜索了一下,应该是我没有配置ssh key的原因,相信很多人都有和我一样的经历吧,这里呢 ...

  6. Linux服务管理

  7. 项目中运行报错: Loading XML bean definitions from class path resource [applicationContext.xml]

    记录一下: org.springframework.context.support.AbstractApplicationContext prepareRefresh Refreshing org.s ...

  8. ReportView报表开发记录(一)

    在公司开发,使用到ReportView技术,写下自己的经验. 1.在工具箱中找到 ReportViewer,ScriptManager放到test.aspx页面. 如果找不到报表项,请参考http:/ ...

  9. 请注意,再次记住, centos7,fedora 24中 没有iptables服务, 而使用的firewalld, 也可以安装 iptables-services程序来实现

    原来写了一篇文章的, 忘了: http://www.cnblogs.com/bkylee/p/5837481.html 可以用 firewall-cmd 这个命令来管理 防火墙...

  10. php文件锁

    前言 1.锁机制之所以存在是因为并发问题导致的资源竞争,为了确保操作的有效性和完整性,可以通过锁机制将并发状态转换成串行状态.作为锁机制中的一种,PHP 的文件锁也是为了应对资源竞争.假设一个应用场景 ...