|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
因为二次编译器太复杂,那么建议只是在安装程序的时候编译一次,而不类似java那样运行就编译。并且我觉得,一次痛苦,总比多次低效率要舒服多了。asp.net|cookie|session 扫瞄器的会话利用存储在SessionID属性中的独一标识符举行标识。会话ID使ASP.NET使用程序可以将特定的扫瞄器与Web服务器上相干的会话数据和信息相干联。会话ID的值在扫瞄器和Web服务器间经由过程Cookie举行传输,假如指定了无Cookie会话,则经由过程URL举行传输。
ASP.NET经由过程主动在页的URL中拔出独一的会话ID来坚持无Cookie会话形态。比方,上面的URL已被ASP.NET修正,以包括独一的会话IDlit3py55t21z5v55vlm25s55:
http://www.ckuyun.com/s(lit3py55t21z5v55vlm25s55)/orderform.aspx
假如一个包括无CookieSessionID的链接被多个扫瞄器共享时(大概经由过程搜刮引擎或其他程序),此举动大概招致对会话数据的不测共享。能够经由过程禁用会话标识符的接纳来下降多个客户端共享会话数据的大概性。为此,将sessionState设置元素的regenerateExpiredSessionId属性设置为true。如许,在利用已过时的会话ID倡议无Cookie会话哀求时,将天生一个新的会话ID。
――摘自MSDN
.NET2.0中我们已能够经由过程重写SessionIDManager类来改动SessionID的天生机制和考证办法来避免会话数据的不测共享(即呈现多个扫瞄器被辨认为统一个会话,共用一个Session),可在.NET1.1中却没有相干的类让我们改动SessionID的天生机制(封装逝世了),但受一篇文章的启示,我们能够在SessionID天生以后对它举行处置。文章是老外写的,因为自己浏览才能无限,偶可没工夫往看一年夜版唧唧歪歪的鹰文,间接下了代码来看。还好代码不算多,思绪也很明晰,也许懂得了他完成重写SessionID的道理,我改了下在无Cookie会话中完善完成了。
相干代码
usingSystem;
usingSystem.Web;
usingSystem.Web.SessionState;
usingSystem.Web.Security;
usingSystem.Configuration;
usingSystem.Security.Cryptography;
usingSystem.Runtime.Serialization;
usingSystem.Globalization;
usingSystem.Text;
publicclassSecureSessionModule:IHttpModule
{
privatestaticstring_ValidationKey=null;
publicvoidInit(HttpApplicationapp)
{
if(_ValidationKey==null)
_ValidationKey=GetValidationKey();
app.AcquireRequestState+=newEventHandler(app_AcquireRequestState);
}
voidapp_AcquireRequestState(Objectsender,EventArgse)
{
_ValidationKey=GetValidationKey();//天天天生一个KEY进步平安性
HttpContextcurrent=((HttpApplication)sender).Context;
//将处置后的SessionID存在Session["ASP.NET_SessionID"]中
stringsessionid=GetSession(current,"ASP.NET_SessionID");
if(sessionid!=null)
{
if(sessionid.Length<=24)
RedirectUrl(current);
stringid=sessionid.Substring(0,24);
stringmac1=sessionid.Substring(24);
stringmac2=GetSessionIDMac(id,current.Request.UserHostAddress,current.Request.UserAgent,_ValidationKey);
//用户客户端信息产生的变更,比对失利
if(String.CompareOrdinal(mac1,mac2)!=0)
{
RedirectUrl(current);
}
}
else
{
RedirectUrl(current);
}
}
privatevoidRedirectUrl(HttpContextcurrent)
{
//重定向页面以从头天生新的SessionID
current.Response.Redirect(current.Request.Url.ToString(),true);
}
privatestringGetValidationKey()
{
stringkey=DateTime.Now.ToShortDateString();
returnkey;
}
privatestringGetSession(HttpContextcurrent,stringname)
{
objectid=FindSession(current.Session,name);
if(id==null)
{
//将用户客户端信息加密存储在Session中以便比对
id=current.Session.SessionID+GetSessionIDMac(current.Session.SessionID,current.Request.UserHostAddress,
current.Request.UserAgent,_ValidationKey);
current.Session[name]=id;
}
returnid.ToString();
}
privateobjectFindSession(HttpSessionStatesession,stringname)
{
returnsession[name];
}
privatestringGetSessionIDMac(stringid,stringip,stringagent,stringkey)
{
StringBuilderbuilder=newStringBuilder(id,512);
builder.Append(ip);
builder.Append(agent);
using(HMACSHA1hmac=newHMACSHA1(Encoding.UTF8.GetBytes(key)))
{
returnConvert.ToBase64String(hmac.ComputeHash(
Encoding.UTF8.GetBytes(builder.ToString())));
}
}
publicvoidDispose(){}
}
相干设置以下:
<configuration>
<system.web>
<httpModules>
<addname="SecureSession"type="SecureSessionModule,SecureSessionModule"/>
</httpModules>
</system.web>
</configuration>
人人看了代码后就会晓得,它完成的道理次要是由于不成能有不异IP电脑客户端同时会见一台服务器,当呈现SessionID不异但他们客户端信息分歧时就主动将后一个会见的客户端重定向以新建一个会话。
遗憾的是在WAP上使用时就有成绩了,因为客户端信息没IP独一标识(挪动不给手机号信息了),以是假如不异型号的手机会见时就没法辨别,不知哪位高人有没更好的办理举措,还看不惜见教
如果英语好,口才好,加上女孩子的优势说不定有机会进去做做别的工具) |
|