.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网站开发,及保证网络安全是有非常有益的。

您可以选择一种方式赞助本站

支付宝转账赞助