.NET框架下的Http知识
.NET框架下的Http知识
讲一个现实中碰到的问题:某公司发布了一个Web网站,然后有相应的会员会打开我们的网站进行一些操作;这些会员分别由相应的业务员进行管理及相关事务的协调;公司通过会员的操作量来考核业务员,同时要求业务员监督会员及时,按时的完成相关操作。这样一来,存在会员与业务员相互通融,会员把账号和密码告诉业务员,叫业务员统一操作,这样一来,业务员的就有机会把他下面的会员的工作量全部都做了,蒙蔽了公司对会员真实操作量的统计与监控,而对业务员的考核显然被作假了。公司要求做一个监控,能看得出哪些会员的操作,很大可能性不是本人真实操作的,哪些业务员帮助会员完成了相关操作。
因为是WEB端,所以无法通过降低安全等级来获取登录电脑的相关信息。采用加密狗,数字签名等也会增加相应的成本。会员操作可确定的是操作的电脑端一般不太会变化,而且又是连接到设置好的打印机,在另外的地方操作界面的情况较少。在一定概率的前提下,会员用的电脑基本不会改变。业务员如果帮会员进行操作,则肯定会在一台电脑上用多个会员账号反复完成多次操作。这就要求我们如何找出,哪些操作可能是业务员记录下来的,哪些操作是会员本身的操作。从而找到有问题的业务员,有问题的不规范的操作。
为此,我们引入了cookie记录的方式。每次访问时都会查找相应的cookie记录,比如特定值:ticket_no。每次登录时,就查找此cookie,如果没有,则创建cookie,设置对应唯一的ticket_no值,时间有效期为长期,并写入到客户端电脑的cookie中;如果有此cookie,读出ticket_no,将访问记录连同登录会员账号一同写到cookie记录表中,这样ticket_no与操作用户就被我们记录下来。假定会员或业务员不经常清理cookie,则每次登录的ticket_no与对应的登录账号我们可以进行一个初步的统计。如果会员都是自己操作的,则ticket_no与登录账号就基本一致,不会频繁的变化;如果一个tciket_no有多个登录账号,则有可能是业务员用会员账号多次进行相关操作,可能存在违规行为。偶尔的不一致当作噪声处理。但这样的统计应该还是很清晰的。不过我们这里有了两个前提:客户端都允许写cookie;用户不会经常清理cookie值。另外,我们还可以获取登录用户的浏览器信息,来反应会员与业务员使用的客户端的相关信息,来进行进一步的分析。
需求很清晰,接下就运用.NET的cookie操作方法,看下面的代码:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | public class Cookies : IHttpHandler { public void ProcessRequest (HttpContext context) { string ticket_no = "" ; string create_by = "" ; if (context.Request.QueryString[ "create_by" ] != null ) { create_by = context.Request.QueryString[ "create_by" ].ToString(); } else create_by = context.User.Identity.Name; HttpCookie myCookie = context.Request.Cookies[ "myCookie" ]; if (myCookie == null ) { //如果为空创建 myCookie = new HttpCookie( "myCookie" ); ticket_no = Guid.NewGuid().ToString(); myCookie.Values.Add( "ticket_no" ,ticket_no); myCookie.Expires = DateTime.Now.AddYears(10); //有效期10年,很长 context.Response.Cookies.Add(myCookie); //写到cookie表记录中 InsertCookies(context, ticket_no, create_by); } else { //读取Cookies if (! string .IsNullOrEmpty(myCookie.Values[ "ticket_no" ])) { ticket_no = myCookie.Values[ "ticket_no" ].ToString(); //写到cookie表记录中 InsertCookies(context, ticket_no, create_by); } } context.Response.ContentType = "text/plain" ; context.Response.Write( "" ); } ... ... } |
另外,如果我们想获取访问的浏览器的相关信息,可以使用Request.Browser对象,能获取到关于访问端的好多信息,比如:浏览器类型,版本,平台,32位还是64位等等,相关具体含义最好查阅msdn文档。代码如下:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 | HttpBrowserCapabilities bc = Request.Browser; Response.Write( "<p>Browser Capabilities:</p>" ); Response.Write( "Type = " + bc.Type + "<br>" ); Response.Write( "Name = " + bc.Browser + "<br>" ); Response.Write( "Version = " + bc.Version + "<br>" ); Response.Write( "Major Version = " + bc.MajorVersion + "<br>" ); Response.Write( "Minor Version = " + bc.MinorVersion + "<br>" ); Response.Write( "Platform = " + bc.Platform + "<br>" ); Response.Write( "Is Beta = " + bc.Beta + "<br>" ); Response.Write( "Is Crawler = " + bc.Crawler + "<br>" ); Response.Write( "Is AOL = " + bc.AOL + "<br>" ); Response.Write( "Is Win16 = " + bc.Win16 + "<br>" ); Response.Write( "Is Win32 = " + bc.Win32 + "<br>" ); Response.Write( "Supports Frames = " + bc.Frames + "<br>" ); Response.Write( "Supports Tables = " + bc.Tables + "<br>" ); Response.Write( "Supports Cookies = " + bc.Cookies + "<br>" ); Response.Write( "Supports VB Script = " + bc.VBScript + "<br>" ); Response.Write( "Supports JavaScript = " + bc.JavaScript + "<br>" ); Response.Write( "Supports Java Applets = " + bc.JavaApplets + "<br>" ); Response.Write( "Supports ActiveX Controls = " + bc.ActiveXControls + "<br>" ); Response.Write( "CDF = " + bc.CDF + "<br>" ); |
还可以获取远端IP地址:
01 02 | Page.Request.UserHostName; Request.ServerVariables[ "REMOTE_ADDR" ]; |
深入理解Http的访问与响应机制,对进行WEB网站开发,及保证网络安全是有非常有益的。