通過改變ASP.NET_SessionId的值,來擷取ASP.NET_SessionId對應所儲存的Session值。
1)因為Session的初始化是在AcquireRequestState事件,所以必須在調用AcquireRequestState事件之前對ASP.NET_SessionId的值進行修改。
2)ASP.NET_SessionId的值進行修改後,必須把修改後的值,返回到用戶端,進行用戶端的cookie值修改。
1.ASP.NET_SessionId的值,必須要符合其規則,不然的話,系統會預設產生一個新的。若修改的ASP.NET_SessionId是在另外一個域下,規則不符合,系統會產生一個新的
ASP.NET_SessionId值,賦予此域下的ASP.NET_SessionId,並未其對應的域下產生一個新的ASP.NET_SessionId。
2.當然,前面第一點提到的是,在系統內部賦予response值前進行修改response值的情況。若在系統內部賦予response值之後進行修改,就不會受此影響。
SessionID的產生過程
首先SessionID是在SessionStateModule裡產生的,是在AcquireRequestState事件裡產生的,調用的方法是:
internal bool CreateSessionId()
{
bool flag;
this._rqId = this._idManager.CreateSessionID(this._rqContext);
this._idManager.SaveSessionID(this._rqContext, this._rqId, out flag, out this._rqAddedCookie);
return flag;
}
通過上面我們可以看到,this._rqId就是產生的SessionID,調用的方法是SessionIDManger的執行個體的CreateSessionID方法,調用方法如下:
public virtual string CreateSessionID(HttpContext context)
{
return SessionId.Create(ref this._randgen);
}
從上面的代碼我們可以看到,其調用的是SeesionId類的靜態方法Create,參數為ref類型,所以通過思考,SessionID的有效期間就是SessionIDManger的執行個體的生命週期。方法如下:
internal static string Create(ref RandomNumberGenerator randgen)
{
if (randgen == null)
{
randgen = new RNGCryptoServiceProvider();
}
byte[] data = new byte[15];
randgen.GetBytes(data);
return Encode(data);
}