Session详解、ASP.NET核心知识(8)
介绍一下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中可以存放任意类型
//Cookie 的值是String
//Session的值可以是几乎任何类型
context.Response.ContentType = "text/html";
context.Session["test1"] = "HelloWorld";
context.Session["test2"]=;2.登录案例
这个案例意图在演示Session的使用,而绝对不是真的登录,项目中这样写,肯定被打死。。。
1)Login页面
//一个比较好的小习惯,吧Session的名字设置成一个常量字段,
//以后可以直接引用这个字段,防止写错。
public const string LOGINUSERNAME = "LoginUserName";
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html";
string username = context.Request["username"];
string password = context.Request["password"];
if (password == "")
{
context.Session[LOGINUSERNAME] = username;
context.Response.Redirect("Main.ashx");
}
else
{
context.Response.Write("密码错误");
}
}2)需要登录才能看到的页面
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html";
string username = (string)context.Session[Login1.LOGINUSERNAME];
if (username == null)
{
context.Response.Redirect("login.html");
}
else if (username == "admin")
{
context.Response.Write("哇,老大好!");
}
else
{
context.Response.Write("当前登录用户名"+username+"没有权限查看");
}
}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
public class MySession
{
//MySessionId是存储卡号的 Cookie名。Cookie中的value是真正的SessionId。
private const string MYSESSIONID = "MySessionId";
private HttpContext context;
private string sessionId;
public MySession(HttpContext context)
{
this.context = context;
HttpCookie cookie = context.Request.Cookies[MYSESSIONID];
if (cookie==null)
{
CreateSession();
}
else
{
this.sessionId = cookie.Value;
}
} private void CreateSession()
{
//姑且用Guid模拟一个SessionId
Guid guid = Guid.NewGuid();
this.sessionId = guid.ToString();
HttpCookie cookie = new HttpCookie(MYSESSIONID);
cookie.Value = sessionId;
context.Response.SetCookie(cookie);
} public void SetValue(string name, string value)
{
//保存路径,在服务器端。
string fullpath = context.Server.MapPath("~/MySession/" + sessionId);
Dictionary<string, string> dict;
if (File.Exists(fullpath))//如果文件存在,则先把之前的数据反序列化出来
{
using (Stream stream = File.OpenRead(fullpath))
{
BinaryFormatter bf = new BinaryFormatter();
dict = (Dictionary<string, string>)bf.Deserialize(stream);
}
}
else
{
dict = new Dictionary<string, string>();//如果不存在,则创建空的字典
}
dict[name] = value;
//dict.Add(name, value);//设置值
using (Stream stream = File.OpenWrite(fullpath))//重新序列化把dict保存到文件
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(stream,dict);
}
} public string GetValue(string name)
{
string fullpath = context.Server.MapPath("~/MySession/" + sessionId);
Dictionary<string, string> dict;
if (File.Exists(fullpath))//如果文件存在,则先把之前的数据反序列化出来
{
using (Stream stream = File.OpenRead(fullpath))
{
BinaryFormatter bf = new BinaryFormatter();
dict = (Dictionary<string, string>)bf.Deserialize(stream);
}
}
else
{
dict = new Dictionary<string, string>();//如果不存在,则创建空的字典
}
if (dict.ContainsKey(name))
{
return dict[name];
}
else
{
return null;
}
}
}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)的更多相关文章
- Cookie详解、ASP.NET核心知识(7)
无状态的http协议 1.回顾http协议 Http协议是请求响应式的,有请求才有响应,是无状态的,不会记得上次和网页“发生了什么”. 关于http协议的这种特点,黑兔在前面的这三篇博文中进行了详细的 ...
- ASP.NET Session详解(转)
ASP.NET Session详解 本文章来自:http://blog.163.com/adam601@126/blog/static/22506317200932824210996/ 当用户在 We ...
- Cookie与Session详解
来源:<PHP核心技术与最佳实践> 列旭松 陈文 著 Cookie与Session详解读书笔记,从概念.操作.应用.注意事项以及区别等几方面详细阐述两者的基础知识,它们都是针对HTTP协议 ...
- 详解ASP.NET MVC 控制器
1 概述 在阅读本篇博文时,建议结合上篇博文:详解ASP.NET MVC 路由 一起阅读,效果可能会更好些. Controller(控制器)在ASP.NET MVC中负责控制所有客户端与服务端的 ...
- orakill和ALTER SYSTEM KILL SESSION详解
--orakill和ALTER SYSTEM KILL SESSION详解[转]-----------------------------------------2013/11/05 一个用户进程偶尔 ...
- 巨人大哥谈Web应用中的Session(session详解)
巨人大哥谈Web应用中的Session(session详解) 虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术. ...
- JavaWeb Session详解
代码地址如下:http://www.demodashi.com/demo/12756.html 记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + ## Session的由来 上一篇博文介绍 ...
- 引用 Session详解 作者:郎云鹏
本文转载自leeldy<Session详解 作者:郎云鹏> 引用 leeldy 的 Session详解 作者:郎云鹏 目录: 一.术语session 二.HTTP协议与状态保持 三.理 ...
- 三张图片详解Asp.Net 全生命周期
用三张图片详解Asp.Net 全生命周期 下面我们使用三张图片解析ASP.net的整个生命周期,我总感觉使用图片更加的清楚的说明这种问题,所以使用的这样方式 说明: 1 第一张图片从全局说明从客户端 ...
- 【Hibernate】Hibernate系列2之Session详解
Session详解 2.1.概述-一级缓存 2.2.操作session缓存方法 2.3.数据库隔离级别 2.4.持久化状态 2.5.状态转换 2.6.存储过程与触发器
随机推荐
- python调用Sikuliapi
Sikuli是由MIT(麻省理工学院) 研究团队发布的一种图形化编程技术(编程小白的福音),使用Sikuli你只需要会写HelloWorld这种最基本的编程技能即可,用Sikuli不需要去写出一行行复 ...
- BZOJ5302 HAOI2018奇怪的背包(动态规划)
由裴蜀定理,子集S有解当且仅当gcd(S,P)|w. 一个显然的dp是设f[i][j]为前i个数gcd为j的选取方案.注意到这里的gcd一定是P的约数,所以状态数是n√P的.然后可以通过这个得到gcd ...
- 018 final 关键字的用途
final关键字的含义 final在Java中是一个保留的关键字,可以声明成员变量.方法.类以及本地变量.一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初 ...
- 【刷题】BZOJ 2005 [Noi2010]能量采集
Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种得 ...
- JeeSite 4.x SAAS 多租户技术设计方案
SaaS 是 Software-as-a-Service(软件即服务)的简称,从技术角度上可称之为 “多租户技术或称多重租赁技术”.它与 “按需软件.应用服务提供商.托管软件” 所具有相似的含义.它是 ...
- 【BZOJ2654】Tree(凸优化,最小生成树)
[BZOJ2654]Tree(凸优化,最小生成树) 题面 BZOJ 洛谷 题解 这道题目是之前\(Apio\)的时候写的,忽然发现自己忘记发博客了... 这个万一就是一个凸优化, 给所有白边二分一个额 ...
- 数字表格(product)
Description Solution 一开始的时候我是这么推的(\(f(n)\)表示斐波那契数列的第\(n\)项) \[ \begin{aligned} Ans&=\prod_{x=1}^ ...
- BZOJ3112 [Zjoi2013]防守战线 【单纯形】
题目链接 BZOJ3112 题解 同志愿者招募 费用流神题 单纯形裸题 \(BZOJ\)可过 洛谷被卡.. #include<algorithm> #include<iostream ...
- CF1009F Dominant Indices 解题报告
CF1009F Dominant Indices 题意简述 给出一颗以\(1\)为跟的有根树,定义\(d_{i,j}\)为以\(i\)为根节点的子树中到\(i\)的距离恰好为\(j\)的点的个数,对每 ...
- java的序列化流和打印流
对象操作流(序列化流) 每次读取和写出的都是JavaBean对象. 序列化:将对象写入到文件中的过程 反序列化:从文件中读取对象到程序的过程 transient: 标识瞬态,序列化的时候,该修饰符修饰 ...

