仓酷云 发表于 2015-1-16 22:49:18

ASP.NET网页编程之ASP.NET 1.1 无 Cookie SessionID 重写...

因为二次编译器太复杂,那么建议只是在安装程序的时候编译一次,而不类似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=id;
}
returnid.ToString();
}
privateobjectFindSession(HttpSessionStatesession,stringname)
{
returnsession;
}
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独一标识(挪动不给手机号信息了),以是假如不异型号的手机会见时就没法辨别,不知哪位高人有没更好的办理举措,还看不惜见教
如果英语好,口才好,加上女孩子的优势说不定有机会进去做做别的工具)

再现理想 发表于 2015-1-20 05:09:25

这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。

只想知道 发表于 2015-1-26 10:47:06

微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。

第二个灵魂 发表于 2015-2-4 14:16:00

众所周知,Windows以易用而出名,也因此占据不少的服务器市场。

冷月葬花魂 发表于 2015-2-10 01:21:40

Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境!

再见西城 发表于 2015-2-28 10:45:48

Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。

愤怒的大鸟 发表于 2015-3-9 22:37:08

同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。

谁可相欹 发表于 2015-3-17 02:34:46

代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。

莫相离 发表于 2015-3-23 17:00:52

ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。
页: [1]
查看完整版本: ASP.NET网页编程之ASP.NET 1.1 无 Cookie SessionID 重写...