私はそれがある限り、その後、着陸後、着陸に内部のユーザーセッションに格納されているユーザ情報を属している必要があり、我々はほとんどの場所を使用し、クッキーやセッション、これらの2つのオブジェクトを理解する多かれ少なかれ、多くの小さなパートナーはBSの開発に従事していることを信じています手動ブラウザまたは終了を閉じていない、あなたは直接の内部で取得する任意の時点でセッションに格納されているユーザ情報、ログインして滞在することができます。
我々は完全に、つまり、サーバーを要求し、任意の関係せずに次の要求をステートレス、ブラウザの要求はコネクションレスであるHTTPプロトコルに基づく要求であることを知って、クライアントがフィードバックにサーバに要求し、この時間私は2件の連続したリクエストが送信され、あなたを知りません。
セッションは、我々はすべての最も基本的な常識の一つである知っているサーバー上に格納されている間クッキーは、クライアントに保存されています。我々は最初のクッキーについて知ってもらうこと。
直接コードに
1 パブリック 文字列ますsetcookie() 2 { 3 4 HttpCookie myCookie = 新しい HttpCookie(" myCustomCookie "、" ABC " )。 5 myCookie.Expiresの=のDateTime.Now.AddMinutes(1 )。 6 Response.Cookies.Add(myCookie)。 7 8 リターン " クッキー设置成功" 。 9 }
(有効期限)属性が重要です設定されていない場合は、クッキーは、ブラウザが閉じられた後にクッキーがリリースされる、ブラウザのメモリに保存されます期限が切れます。有効期限が現在時刻よりも大きい場合、クッキーは、上記のクライアントのハードディスクに保存されますが、有効期限の前に、各要求はクッキーをもたらすでしょう。有効期限は、以下の現在時刻に等しい場合、クッキーを削除することと等価です。
セッションの原則が今実現されているものそこで、我々は、テストするためのメソッドを書きます
1 パブリック 文字列SetSession() 2 { 3 セッション[ " loginUser " ] = " MXJ " 。 4 HttpContext.Session [ " loginPwd " ] = " 123 " 。 5 HttpContext.Session.Timeout = 1 。 6 7 8 リターン " セッション设置成功" 。 9 }
私たちは、値がセッションに設定され、この方法を訪れ、その後、我々はすべての要求を見つけ、持って来るASP.NET_SessionIdクッキーのを。
実際には、セッション機能は、これに基づいているASP.NET_SessionIdクッキー我々はセッション[「loginUser」] =「を使用する場合、実際の達成するために MXJを」; セッションでは、我々はキー、値の辞書のコンテナとして理解することができる値を設定し、キーがあります現在ASP.NET_SessionIdクッキー値 、値がこのタイプであるSystem.Web.HttpSessionStateWrapperの Sessionオブジェクト、我々は実際のセッションで動作し、このタイプの操作はHttpSessionStateWrapperの一例です。セッションが実際にあるように、我々は単純に理解することができるのメモリにサービスを保存するためにASP.NET_SessionIdオブジェクトディクショナリのキー値のため。
上記の理解によると、我々は、セッションの値を設定し、場合、ASP.NET_SessionId次のように削除クッキーを、私たちはセッションの値にアクセスすることはできません、我々は、確認する必要が
1 パブリック 文字列SetSession() 2 { 3 セッション[ " loginUser " ] = " MXJ " 。 4 HttpContext.Session [ " loginPwd " ] = " 123 " 。 5 HttpContext.Session.Timeout = 1 。 6 7 8 リターン " セッション设置成功" 。 9 } 10 11 公共の 文字列のgetSession() 12 { 13 StringBuilderのSB = 新規のStringBuilder(); 14 15 HttpSessionStateBase sessionStateBase = HttpContext.Session。 16 のためには、(int型 = Iを0 ; iは<sessionStateBase.Count; iは++ ) 17 { 18 sb.Append(sessionStateBase.Keysを[I] + " :" + sessionStateBase [I] + " <BR /> " ); 19 } 20 21 戻りsb.ToString()。 22 } 23 24 公共の 文字列ClearCookie() 25 { 26 HttpCookieCollectionをnewCollection = 新しいHttpCookieCollection()。 27 HttpCookieCollection cookieCollection = Request.Cookies。 28 のために(int型 I = 0 ; iがcookieCollection.Countを<; Iは++ ) 29 { 30 cookieCollection [I] .Expires = DateTime.Now.AddMinutes( - 1 )。 31 newCollection.Add(cookieCollection [I])。 32 33 //Response.SetCookie(cookieCollection [I])。 34 } 35 36 のために(INT J = 0 ; J <newCollection.Count; J ++ ) 37 { 38 Response.Cookies.Add(をnewCollection [J])。 39 } 40 41 リターン " クッキークリア成功" 。 42 }
実行方法のSetSessionましょう、その後、メソッドのgetSessionを行い、我々は、セッションの値を取得します
あなたがこの方法を行うと、私たちはクッキーのレコードを送信することにより、この要求を取る必要があり、爬虫類シミュレーションによって要求されたバックするときに使用されます
いずれの結果なしで、そして、我々は明確な方法ClearCookieすべてのクッキーを実行し、セッションを取得するメソッドのgetSessionを行い、(空白、結果なし、なしスクリーンショット)。
このASP.NET_SessionIdキーの値に対応するサーバのメモリ値はNaまたは結果として除去し、Na存在し続けることは?
次のように私たちは、結果を検証するための簡単な爬虫類を書きました
1 private void btnCatch_Click(object sender, EventArgs e) 2 { 3 var url = tbxUrl.Text; 4 url = url.Trim(); 5 6 var cookie = tbxCookie.Text; 7 8 var result = HttpHelper.DownloadUrl(url, cookie); 9 10 tbxResult.Text = result; 11 } 12 13 14 15 public class HttpHelper 16 { 17 //private static Logger logger = new Logger(typeof(HttpHelper)); 18 19 /// <summary> 20 /// 根据url下载内容 之前是GB2312 21 /// </summary> 22 /// <param name="url"></param> 23 /// <returns></returns> 24 public static string DownloadUrl(string url, string cookie = null) 25 { 26 return DownloadHtml(url, Encoding.UTF8, cookie); 27 } 28 29 //HttpClient--WebApi 30 31 /// <summary> 32 /// 下载html 33 /// http://tool.sufeinet.com/HttpHelper.aspx 34 /// HttpWebRequest功能比较丰富,WebClient使用比较简单 35 /// </summary> 36 /// <param name="url"></param> 37 /// <returns></returns> 38 public static string DownloadHtml(string url, Encoding encode, string cookie) 39 { 40 string html = string.Empty; 41 try 42 { 43 //https可以下载-- 44 45 //ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback((object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) => 46 //{ 47 // return true; //总是接受 48 //}); 49 //ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; 50 51 HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest;//模拟请求 52 request.Timeout = 30 * 1000;//设置30s的超时 53 //request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36"; 54 //request.UserAgent = "User - Agent:Mozilla / 5.0(iPhone; CPU iPhone OS 7_1_2 like Mac OS X) App leWebKit/ 537.51.2(KHTML, like Gecko) Version / 7.0 Mobile / 11D257 Safari / 9537.53"; 55 56 request.ContentType = "text/html; charset=utf-8";// "text/html;charset=gbk";// 57 //request.Host = "search.yhd.com"; 58 59 request.Headers.Add("Cookie", cookie); 60 61 //request.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); 62 //request.Headers.Add("Accept-Encoding", "gzip, deflate, sdch"); 63 //request.Headers.Add("Referer", "http://list.yhd.com/c0-0/b/a-s1-v0-p1-price-d0-f0-m1-rt0-pid-mid0-kiphone/"); 64 65 //Encoding enc = Encoding.GetEncoding("GB2312"); // 如果是乱码就改成 utf-8 / GB2312 66 67 //如何自动读取cookie 68 //request.CookieContainer = new CookieContainer();//1 给请求准备个container 69 using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)//发起请求 70 { 71 if (response.StatusCode != HttpStatusCode.OK) 72 { 73 //logger.Warn(string.Format("抓取{0}地址返回失败,response.StatusCode为{1}", url, response.StatusCode)); 74 } 75 else 76 { 77 try 78 { 79 //string sessionValue = response.Cookies["ASP.NET_SessionId"].Value;//2 读取cookie 80 StreamReader sr = new StreamReader(response.GetResponseStream(), encode); 81 html = sr.ReadToEnd();//读取数据 82 sr.Close(); 83 } 84 catch (Exception ex) 85 { 86 //logger.Error(string.Format($"DownloadHtml抓取{url}失败"), ex); 87 html = null; 88 } 89 } 90 } 91 } 92 catch (System.Net.WebException ex) 93 { 94 if (ex.Message.Equals("远程服务器返回错误: (306)。")) 95 { 96 //logger.Error("远程服务器返回错误: (306)。", ex); 97 html = null; 98 } 99 } 100 catch (Exception ex) 101 { 102 //logger.Error(string.Format("DownloadHtml抓取{0}出现异常", url), ex); 103 html = null; 104 } 105 return html; 106 } 107 }
这是一个winform的程序,抓取结果如下
在服务器还没有释放Session值之前,我们还是可以通过ASP.NET_SessionId的Cookie获取到对应的Session值。
那么Session在服务器内存会保存多久呐,
我们会有一个Timeout的属性来设置它的过期时间(分钟为单位),如果没有设置,就默认配置文件为准,IIS的默认Session释放时间好像是20分钟。
以上是本人自己摸索所得,有什么不正确的地方,欢迎提出意见。