介绍一下Session

1.作用

Cookie是存在客户端,Session是存在服务器端,目的是一样的:保存和当前客户端相关的数据(当前网站的任何一个页面都能取到Session)。

在本篇博文的姊妹篇《Cookie详解》中,黑兔在最后说了几点Cookie的缺陷,简单的说就是无法存储重要数据。那么关乎重要数据的状态如何存储?Cookie妹妹Session讲给你一个很好的答案。

2.医生的账本

需要一种“服务器端的Cookie”:医生需要一个私人账本,记录病人编号和身份的对应关系。由于身份证无法造假,所以能够保证信息不被假冒。(身份证无法造假,这个身份证就可以唯一标识这个用户;)核心信息放到服务器上,客户端无法去篡改。这就是Session的大体原理。

3.IRequiresSessionState

Cookie不能存储机密数据。要使用ASP.Net已经内置的Session机制。普通的HttpHandler要能够操作Session,要实现IRequiresSessionState接口,这个接口是没有任何方法的“标记接口”,因为session处理会稍微降低系统性能,所以 HttpHandler 默认不处理Session,asp.net引擎如果看到ashx实现了IRequiresSessionState,则帮咱们处理。

4.自毁装置

Session有自动销毁机制,如果一段时间内浏览器没有和服务器发生任何的交互,则Session会定时销毁。这也就是为什么一段时间不操作,系统就会自动退出。

当然Session也可以手动设置销毁,比如做安全退出的功能。就需要用到。 context.Session.Abandon();//销毁Session

5.自毁倒计时

在web.config的system.web节点下配置sessionState节点的timeout,单位是分钟,默认是20(也只是一个建议,也许服务器10分钟的时候就让Session失效了)

.NET中如何使用Session

1.Session中可以存放任意类型

  1. //Cookie 的值是String
  2. //Session的值可以是几乎任何类型
  3. context.Response.ContentType = "text/html";
  4. context.Session["test1"] = "HelloWorld";
  5. context.Session["test2"]=;

2.登录案例

这个案例意图在演示Session的使用,而绝对不是真的登录,项目中这样写,肯定被打死。。。

1)Login页面

  1. //一个比较好的小习惯,吧Session的名字设置成一个常量字段,
  2. //以后可以直接引用这个字段,防止写错。
  3. public const string LOGINUSERNAME = "LoginUserName";
  4. public void ProcessRequest(HttpContext context)
  5. {
  6. context.Response.ContentType = "text/html";
  7. string username = context.Request["username"];
  8. string password = context.Request["password"];
  9. if (password == "")
  10. {
  11. context.Session[LOGINUSERNAME] = username;
  12. context.Response.Redirect("Main.ashx");
  13. }
  14. else
  15. {
  16. context.Response.Write("密码错误");
  17. }
  18. }

2)需要登录才能看到的页面

  1. public void ProcessRequest(HttpContext context)
  2. {
  3. context.Response.ContentType = "text/html";
  4. string username = (string)context.Session[Login1.LOGINUSERNAME];
  5. if (username == null)
  6. {
  7. context.Response.Redirect("login.html");
  8. }
  9. else if (username == "admin")
  10. {
  11. context.Response.Write("哇,老大好!");
  12. }
  13. else
  14. {
  15. context.Response.Write("当前登录用户名"+username+"没有权限查看");
  16. }
  17. }

3.验证码

关于验证码的问题,Session可以记录验证码的值,黑兔在《详细说说如何生成验证码》一文中有过详细的说明,这里多说了。

Session原理

1.看看http报文

通过http报文,我们发现报文里Cookie中有一段ASP.NET_SessionId=a4dsx.....的字符,这段什么意思?没错她就是Session。

2.Session是服务器里的Cookie

正常情况下Session存储在服务器的内容中,浏览器端存储这一个带有SessionId 内容的Cookie。存有Session的服务器内存就想一个银行,与之对应的浏览器Cookie就想银行卡,SessionId就是银行卡号。浏览器中不存储任何重要信息,仅有一个“钥匙”可以打开这个银行。 这就是Session的原理。

3.用Cookie模拟一个Session

  1. public class MySession
  2. {
  3. //MySessionId是存储卡号的 Cookie名。Cookie中的value是真正的SessionId。
  4. private const string MYSESSIONID = "MySessionId";
  5. private HttpContext context;
  6. private string sessionId;
  7. public MySession(HttpContext context)
  8. {
  9. this.context = context;
  10. HttpCookie cookie = context.Request.Cookies[MYSESSIONID];
  11. if (cookie==null)
  12. {
  13. CreateSession();
  14. }
  15. else
  16. {
  17. this.sessionId = cookie.Value;
  18. }
  19. }
  20.  
  21. private void CreateSession()
  22. {
  23. //姑且用Guid模拟一个SessionId
  24. Guid guid = Guid.NewGuid();
  25. this.sessionId = guid.ToString();
  26. HttpCookie cookie = new HttpCookie(MYSESSIONID);
  27. cookie.Value = sessionId;
  28. context.Response.SetCookie(cookie);
  29. }
  30.  
  31. public void SetValue(string name, string value)
  32. {
  33. //保存路径,在服务器端。
  34. string fullpath = context.Server.MapPath("~/MySession/" + sessionId);
  35. Dictionary<string, string> dict;
  36. if (File.Exists(fullpath))//如果文件存在,则先把之前的数据反序列化出来
  37. {
  38. using (Stream stream = File.OpenRead(fullpath))
  39. {
  40. BinaryFormatter bf = new BinaryFormatter();
  41. dict = (Dictionary<string, string>)bf.Deserialize(stream);
  42. }
  43. }
  44. else
  45. {
  46. dict = new Dictionary<string, string>();//如果不存在,则创建空的字典
  47. }
  48. dict[name] = value;
  49. //dict.Add(name, value);//设置值
  50. using (Stream stream = File.OpenWrite(fullpath))//重新序列化把dict保存到文件
  51. {
  52. BinaryFormatter bf = new BinaryFormatter();
  53. bf.Serialize(stream,dict);
  54. }
  55. }
  56.  
  57. public string GetValue(string name)
  58. {
  59. string fullpath = context.Server.MapPath("~/MySession/" + sessionId);
  60. Dictionary<string, string> dict;
  61. if (File.Exists(fullpath))//如果文件存在,则先把之前的数据反序列化出来
  62. {
  63. using (Stream stream = File.OpenRead(fullpath))
  64. {
  65. BinaryFormatter bf = new BinaryFormatter();
  66. dict = (Dictionary<string, string>)bf.Deserialize(stream);
  67. }
  68. }
  69. else
  70. {
  71. dict = new Dictionary<string, string>();//如果不存在,则创建空的字典
  72. }
  73. if (dict.ContainsKey(name))
  74. {
  75. return dict[name];
  76. }
  77. else
  78. {
  79. return null;
  80. }
  81. }
  82. }

1)这个例子用使用了一个名为MySessionId的Cookie存储SessionId。SessionId=context.Request.Cookies[MYSESSIONID].value。SessionId作为服务器端存储Session数据的文件名。

2)通过序列化,和反序列的方式把一个Dictionary对象 存储在服务器端。

3)SessionId的值,是由Guid生成的。 ASP.NET如何命名的,我不晓得姑且用GUID做一个标识,总之唯一就好了。

4)总之这个案例演示的就是这样一个原理图。这个原理图与Seesion机制基本一致。

进程外Session

1.进程外Session?

刚刚说了,常规情况下Session是保存在服务器的内存中的。这种方式,会带来一定的性能损耗。进程外Session就是把Session从内存中拿到其他地方存储。

2.Session保存在SQLServer中配置方法

1)运行.NetFramework安装目录下对应版本的aspnet_regsql.exe 来创建相关的数据库、表和存储过程等,比如:

C:\Windows\Microsoft.NET\Framework\v4.0.30319>aspnet_regsql.exe -ssadd -sstype p -S 127.0.0.1 -U sa -P 123456

其中-sstype p表示数据库名固定为ASPState,-S(大写)为数据库服务器地址,-U和-P分别为数据库的用户名和密码,

参数详细解释见 http://blog.csdn.net/yuanzhuohang/article/details/6758304

2)修改web.config中sessionState节点的配置:<sessionState mode="SQLServer" timeout="20" sqlConnectionString="server=.;uid=sa;password=123456;" ></sessionState>

本文的姊妹篇Cookie

Cookie详解

Session详解、ASP.NET核心知识(8)的更多相关文章

  1. Cookie详解、ASP.NET核心知识(7)

    无状态的http协议 1.回顾http协议 Http协议是请求响应式的,有请求才有响应,是无状态的,不会记得上次和网页“发生了什么”. 关于http协议的这种特点,黑兔在前面的这三篇博文中进行了详细的 ...

  2. ASP.NET Session详解(转)

    ASP.NET Session详解 本文章来自:http://blog.163.com/adam601@126/blog/static/22506317200932824210996/ 当用户在 We ...

  3. Cookie与Session详解

    来源:<PHP核心技术与最佳实践> 列旭松 陈文 著 Cookie与Session详解读书笔记,从概念.操作.应用.注意事项以及区别等几方面详细阐述两者的基础知识,它们都是针对HTTP协议 ...

  4. 详解ASP.NET MVC 控制器

    1   概述 在阅读本篇博文时,建议结合上篇博文:详解ASP.NET MVC 路由  一起阅读,效果可能会更好些. Controller(控制器)在ASP.NET MVC中负责控制所有客户端与服务端的 ...

  5. orakill和ALTER SYSTEM KILL SESSION详解

    --orakill和ALTER SYSTEM KILL SESSION详解[转]-----------------------------------------2013/11/05 一个用户进程偶尔 ...

  6. 巨人大哥谈Web应用中的Session(session详解)

    巨人大哥谈Web应用中的Session(session详解) 虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术. ...

  7. JavaWeb Session详解

    代码地址如下:http://www.demodashi.com/demo/12756.html 记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + ## Session的由来 上一篇博文介绍 ...

  8. 引用 Session详解 作者:郎云鹏

    本文转载自leeldy<Session详解 作者:郎云鹏>   引用 leeldy 的 Session详解 作者:郎云鹏 目录: 一.术语session 二.HTTP协议与状态保持 三.理 ...

  9. 三张图片详解Asp.Net 全生命周期

    用三张图片详解Asp.Net 全生命周期 下面我们使用三张图片解析ASP.net的整个生命周期,我总感觉使用图片更加的清楚的说明这种问题,所以使用的这样方式 说明: 1  第一张图片从全局说明从客户端 ...

  10. 【Hibernate】Hibernate系列2之Session详解

    Session详解 2.1.概述-一级缓存 2.2.操作session缓存方法 2.3.数据库隔离级别 2.4.持久化状态 2.5.状态转换 2.6.存储过程与触发器

随机推荐

  1. 对it行业的一些看法

    随着世界产业转移的加速,欧美.日本等发达国家将大量的软件开发业务转移到中国.印度等国家,随之而来的是这些国家对it人才的急切需求! 对比国内的大学生就业形势而言,无疑是it相关专业的毕业生就业压力较少 ...

  2. 补发9.28“天天向上”团队Scrum站立会议

    组长:王森 组员:张金生 张政 栾骄阳 时间:2016.09.28 地点:612寝 组员 已完成 未完成 王森 搭建初步原型 完善原型 张金生 更新UI设计 生成应用界面原型 张政 初步设计框架图 完 ...

  3. mongo学习1 (转)

    关于mongodb的好处,优点之类的这里就不说了,唯一要讲的一点就是mongodb中有三元素:数据库,集合,文档,其中“集合” 就是对应关系数据库中的“表”,“文档”对应“行”. 一: 下载 上Mon ...

  4. mybaits入门(含实例教程和源码) http://blog.csdn.net/u013142781/article/details/50388204

    前言:mybatis是一个非常优秀的存储过程和高级映射的优秀持久层框架.大大简化了,数据库操作中的常用操作.下面将介绍mybatis的一些概念和在eclipse上的实际项目搭建使用. 一.mybati ...

  5. Html5 web 本地存储 (localStorage、sessionStorage)

    HTML5 提供了两种在客户端存储数据的新方法localStorage,sessionStorage sessionStorage(临时存储) :为每一个数据源维持一个存储区域,在浏览器打开期间存在, ...

  6. Codeforces 449B_Jzzhu and Cities

    给一个无向图,外加一些特殊的连接原点的无向边.在不改变原点与所有点的最短路的情况下,最多可以删除多少条特殊边? 首先我们把所有的边夹杂在一起.spfa跑出与所有点的最短路. 接下来我们通过一次bfs来 ...

  7. [Offer收割]编程练习赛23-freeloop

    A. H国的身份证号码I dfs裸题. 时间复杂度\(O(n^k)\). #include <bits/stdc++.h> #define FOR(i,a,b) for (int i=a; ...

  8. Qt——结合qt和python

    经常使用qt的童鞋一定有过这样的经历:百度或Google某个关于Qt的问题的时候,发现有的解答不是用的C++,而是包含很多py.__init__.self之类的词. 如果学过python,你会发现,这 ...

  9. 记一次java程序out of memory问题

    在一个比较大批量的pdf转String项目中遇到了:java.lang.OutOfMemoryError: Java heap space错误 第一反应肯定是程序没有写好,大量循环时没有把程序中没有用 ...

  10. c++11 继承构造

    c++11 继承构造 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #includ ...