ASP.NET Session概述

来源:互联网 发布:ip地址与域名 编辑:程序博客网 时间:2024/05/04 12:39

Session是服务端一种状态保持机制,可以将各种类型数据存储到Session,最终这些数据是存储到服务器的内存中。

请求响应过程

用vs建一个web窗体test.aspx
在test.aspx中填写代码

<form id="form1" runat="server">    <div>        <input type="text" name="txtName" value="hello" /><br />        <input type="submit" value="提交"/>    </div></form>

在test.aspx.cs中填写代码

protected void Page_Load(object sender, EventArgs e)        {            if (IsPostBack)            {                string name = Request.Form["txtName"];                Session["userName"] = name;//创建Session,userName是键,name存的是值                Response.Redirect("test2.aspx");//跳转到test2.aspx            }        }

用vs建一个test2.aspx
在test2.aspx.cs中填写代码

protected void Page_Load(object sender, EventArgs e)        {            if (Session["userName"]!=null)//获取Seeion之前要判断是否为空            {                Response.Write(Session["userName"]);//获取Session的值            }        }

在浏览器中浏览test.aspx,点击提交按钮
请求过程如下

点击提交按钮后,浏览器将hello发送给服务器,服务器开始执行test.aspx.cs中的代码。
这段代码会,接收到hello,创建一个Session(键为userName,值为hello),服务器会在内存中开辟Session的存储区域,这个存储区域再分响应的存储单元,并为每个单元加上一个编号,这个编号就是SessionID。
执行到Redirect的时候,服务器向浏览器返回一个302和Location,这时SessionID会以Cookie的形式返回给浏览器,存储在浏览器的内存中。
这里写图片描述
浏览器接受到服务器返回的数据以后发现是302,那么浏览器会重新想Location指定的页面(test2.aspx)发送请求,同时将SessionID放在请求报文中,发送到服务端对应的页面中。
这里写图片描述
服务器(test2.aspx)接收到客户端通过Cookie传递过来的SessionID,从对应的存储单元获取相应的值。

过期时间

Session的默认过期时间是20分钟,20分钟之后服务器内存中的Session就没了。这时候再请求Session就请求不到了。但这时候浏览器中还有SessionId,但把浏览器关了之后就没了。
还有一种情况,比如我在第10分钟的时候把浏览器关了,之后再重新访问Session,这时候也是访问不到的,因为浏览器中的SessionId没了。但因为还没有到20分钟,服务器中的内存是有Session的。
这个过期时间是一个滑动过期时间,比如,当Session创建之后,就开始计时,当我在第10分钟的时候请求了一次Session,这时候其过期时间又变成了20分钟。
可用Timeout属性来设置其默认过期时间。

Session.Timeout=30;//设定为30分钟

应用

后台管理的主页面必须要登陆之后才可以访问的,但如果我知道主页面的地址,并且系统没有加限制,我可以直接在地址栏访问主页面,那登陆页面就没有意义了。
可以在登陆信息都正确之后,将用户信息存储到Session中。在需要登陆以后才能访问的页面中校验Session,如果Session有值,说明用户登陆了,继续访问页面,如果没有值,说明用户没有登陆,那么跳转到登陆页面。
如果我登陆之后才能访问的页面非常多,难道要每个页面都校验一次Session是否为空?
新建一个类PageBase

public class PageBase:System.Web.UI.Page{       //PreInit事件:在页 System.Web.UI.Control.Load 事件之前发生。    protected void Page_PreInit(object sender,EventArgs e)    {        if(Session["userInfo"==null])        {            Response.Redirect("Login.aspx");        }    }}

以前的aspx.cs中的类都是继承Page,现在改成继承PageBase

0 0
原创粉丝点击