`

9、使用Session状态

阅读更多
使用Session状态

不可能真的用Cookie来保存购物车。cookie太小也太简单。
要突破Cookie的限制,Asp.net Framework支持一个名为Session状态的功能。

Session没有大小限制
Session可以保存复杂的对象。

SessionSet.aspx
<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

    protected void Page_Load(object sender, EventArgs e)
    {
        Session["message"] = "Hello World!";
    }
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h1>
            Session Item Added!</h1>
    </div>
    </form>
</body>
</html>


SessionGet.aspx
<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

    protected void Page_Load(object sender, EventArgs e)
    {
        lblMessage.Text = Session["message"].ToString();
    }
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="lblMessage" runat="server"></asp:Label>
    </div>
    </form>
</body>
</html>


当使用Session状态时,一个名叫Asp.net_sesionid的Cookie会自动添加到浏览器。
包含了一个唯一标识符,可在页面切换时跟踪用户。

向Session对象增添项目时,这个项目将存储在Web服务器上而不是Web浏览器上。Asp.net_sessionId用于正确地关联数据和用户。

默认情况下,如果Cookie被禁用,Session状态也不能工作。
                  如果用户超过20分钟不请求任何页面,删除Session状态数据。

2011-5-13 11:27 danny
1、在Session状态中保存数据库数据
可以用Session状态来创建用户相关的缓存。
可为用户载入数据,然后允许用户排序或过滤该数据。

SessionDataView.aspx
<%@ Page Language="C#" %>

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Web.Configuration" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
    DataView dvMovies;
    protected void Page_Load(object sender, EventArgs e)
    {
        dvMovies = (DataView)Session["Movies"];
        if (dvMovies == null)
        {
            string conString = WebConfigurationManager.ConnectionStrings["Movies"].ConnectionString;
            SqlDataAdapter dad = new SqlDataAdapter("Select ID,Title,Director from Movies", conString);
            DataTable dtblMovies = new DataTable();
            dad.Fill(dtblMovies);
            dvMovies = new DataView(dtblMovies);
            Session["Movies"] = dvMovies;
        }
    }

    protected void grdMovies_Sorting(object sender, GridViewSortEventArgs e)
    {
        dvMovies.Sort = e.SortExpression;
    }

    protected void Page_PreRender(object sender, EventArgs e)
    {
        grdMovies.DataSource = dvMovies;
        grdMovies.DataBind();
    }
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="grdMovies" AllowSorting="true" EnableViewState="false" runat="server"
            OnSorting="grdMovies_Sorting">
        </asp:GridView>
        <br />
        <asp:LinkButton ID="lnkReload" Text="Reload Page" runat="server" />
    </div>
    </form>
</body>
</html>


同时要新建数据库,Web.config增加ConString
数据库表:Movies
 id               title                   director
int(自增)   nvchar(50)         nVarchar(50)


web.config添加代码:
<configuration>
	<connectionStrings>
		<add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/>
    <add name="Movies" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\s2_3.mdf;User Instance=true" providerName="System.Data.SqlClient"/>
  </connectionStrings>


结果:

2011-5-16 15:23 danny

2、使用Session对象
主要API是:HttpSessionState类
HttpSessionState属性:
  CookieMode
  Count
  IsCookieless
  IsNewSession
  IsReadOnly
  Keys
  Mode
  SessionID
  TimeOut
方法:
Abandon
Clear
Remove

3、处理Session事件
Global.asax中包含两个可以处理的关联Session状态的事件:Session Start和Session End事件。
Session Start事件在一个新用户会话开始时被触发。可以利用该事件从数据库载入用户信息。
Session End事件在会话终止时被触发。会话会因用户不活动而过期或者因电焊工地使用Session.Abandon()方法终止。

Glabal.asax
<%@ Application Language="C#" %>
<script RunAt="server">

    void Application_Start(object sender, EventArgs e)
    {
        // 在应用程序启动时运行的代码
        Application["SessionCount"] = 0;
    }

    void Application_End(object sender, EventArgs e)
    {
        //  在应用程序关闭时运行的代码

    }

    void Application_Error(object sender, EventArgs e)
    {
        // 在出现未处理的错误时运行的代码

    }

    void Session_Start(object sender, EventArgs e)
    {
        // 在新会话启动时运行的代码
        Application.Lock();
        int count = (int)Application["SessionCount"];
        Application["SessionCount"] = count + 1;
        Application.UnLock();

    }

    void Session_End(object sender, EventArgs e)
    {
        // 在会话结束时运行的代码。 
        // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为 InProc 时,才会引发 Session_End 事件。
        // 如果会话模式设置为 StateServer 
        // 或 SQLServer,则不会引发该事件。
        Application.Lock();
        int count = (int)Application["SessionCount"];
        Application["SessionCount"] = count - 1;
        Application.UnLock();
    }
       
</script>


显示SessionCount:ShowSessionCount.aspx
<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    protected void Page_Load(object sender, EventArgs e)
    {
        lblSessionCount.Text = Application["SessionCount"].ToString();
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
        <asp:Label ID="lblSessionCount" runat="server"></asp:Label>
    
    </div>
    </form>
</body>
</html>


2011-5-16 15:44 danny

4、会话失效控制
默认情况下,如果用户20分钟还不请求页面,Asp.net Framework认为他已经离开应用程序。
可以修改
web.config
<configuration>
 <system.web>
  <sessionState timeout="60"/>
 </system.web>
</configuration>


也可以使用Session.Timeout=60;

5、使用无Cookie的Session状态
SessionID
P113-114

6、配置Session状态存储
默认情况下,Session状态被保存在Asp.net所在的相同的进程。
两个缺点:
  1.进程内Session状态很脆弱
  2.进程内Session状态可伸缩性较差

Session状态模式为以下值:
Off
InProc
StateServer
SQLServer
Custom
P115-P116

7、配置SQLServer Session状态
如果希望尽可能可靠地保存Session状态,可将Session状态保存到SQL Server数据库。
P117-P118

2011-5-16 16:03 danny

分享到:
评论

相关推荐

    使用session保持登陆状态

    "使用session保持登陆状态"这个主题就是关于如何在用户成功登录后,通过服务器端的session技术来维持其在线状态,直到用户主动退出或者session过期。下面我们将深入探讨这个话题。 首先,我们了解什么是session。...

    oracle查看session状态

    自己整理的关于oracle session的状态查看,对新手有一定的帮助,希望您喜欢。

    Java 使用HttpClient保持SESSION状态

    以上就是在Java中使用HttpClient保持SESSION状态的基本流程。在实际项目中,可能还需要处理重定向、超时、错误处理等复杂情况。注意,对于HTTPS站点,可能需要配置SSLContext和TrustManager,以允许HttpClient信任自...

    asp.net c# 在类中使用session的方法

    在Web应用程序开发中,特别是在ASP.NET C#应用中,正确且有效地在类中使用Session是非常重要的,这能帮助我们实现用户个性化体验、购物车管理、登录状态维护等功能。 ### 一、理解ASP.NET中的Session Session对象...

    java中使用session模拟用户登陆

    在Java Web开发中,Session是服务器端用于跟踪用户状态的一种机制。当用户通过用户名和密码登录系统后,服务器需要一种方式来识别这个已验证的用户,以便在后续的请求中提供个性化的服务,例如访问权限控制。这时,...

    JavaWeb使用Session和Cookie实现登录认证

    使用 Session 和 Cookie 实现登录认证可以提供一种安全的方式来验证用户的登录状态。通过使用 Session 和 Cookie,可以将用户的登录状态存储在服务器端和客户端,使得用户可以安全地访问服务器上的资源。

    在asp.net中使用session常见问题集锦

    这两个接口分别表示需要读写Session状态和只需要读取Session状态。如果没有实现这些接口,系统默认不允许使用Session。 #### 在Web Farm环境下为何Session会丢失? 在Web Farm环境中,因为用户请求可能被负载均衡...

    hibernate中session对象的状态详解

    hibernate中session对象的状态详解

    .net core 6 使用session进行验证

    5. 检查Session状态: 当需要验证用户时,我们可以检查Session中是否存在特定的值: ```csharp int? userId = HttpContext.Session.GetInt32("UserId"); if (userId.HasValue) { // 用户已验证 } else { ...

    session实现记录用户登录状态

    用session记录用户的登录状态 1.登录 2.登录成功后将此“已登录”状态保存。 3.实现“显示员工列表”功能。 4.当用户点击“显示员工列表”的时候,验证用户是否已登录,已登录继续显示员工列表,没有登录则跳转到...

    session 状态 失效

    Session状态失效,简单来说,就是用户在使用过程中突然失去了服务器端保存的相关信息,导致功能异常或用户体验下降。 在描述中提到的博客链接(由于无法直接访问,我们只能根据标题和标签推测内容),可能详细解析...

    Session Bean的使用

    JavaBean和Session Bean是Java企业级应用开发中的重要概念,特别是在使用Enterprise JavaBeans(EJB)技术时。本文将深入探讨这两个概念,以及如何在实际项目中使用它们。 首先,让我们了解什么是JavaBean。...

    SESSION处于KILLED状态下如何找出对应的进程

    SESSION处于KILLED状态下如何找出对应的进程 SESSION是一个Oracle数据库中的会话管理机制,它允许用户连接到数据库并执行相应的操作。然而,在某些情况下,SESSION可能会处于KILLED状态,这时候我们需要找出对应的...

    j2ee实验二:学习使用Session和Cookie

    - 使用Session或Cookie来记录用户的状态。 - 在服务器端验证输入的信息,返回登录成功或失败的结果。 #### 结论 通过本实验的学习,学生不仅掌握了Session和Cookie的基本概念和用法,还能够独立开发简单的Web...

    Struts2 的Action使用session的方法

    下面将详细讲解如何在Struts2的Action中使用session。 首先,理解session的基本概念。在Web开发中,session是一种服务器端存储用户状态的方式。当用户打开浏览器访问网站时,服务器会为该用户分配一个唯一的session...

    session session session szsessdifn

    为了克服Session的一些缺点,可以考虑使用Cookie(但Cookie大小和数量有限制)、Viewstate(适合在同一页内保持状态)、Application(全局共享数据,不随用户变化)或者数据库存储(适合大量持久化数据)等替代方案...

    在WEB API中启用session

    2. 启用Session状态:在Global.asax.cs文件的`Application_Start`方法中,设置`GlobalConfiguration.Configuration`的`HttpConfiguration`对象的`EnableSessionState`属性为`true`。 ```csharp protected void ...

    session的使用

    【Session的使用详解】 在Web开发中,Session是用于跟踪用户状态的一种机制,尤其是在HTTP协议无状态特性下,Session显得尤为重要。HTTP协议是基于请求-响应模型的,每次请求都被视为独立的,服务器不会记住之前的...

    SSHnote session函数的对象状态转换

    SSHnote session函数的对象状态转换是Hibernate框架中一个关键的概念,涉及到如何管理数据库中的持久化对象。在Hibernate中,对象有三种基本状态:瞬时(Transient)、持久化(Persistent)和脱管(Detached)。理解...

    birt 使用session数据, 通过servlet访问

    总的来说,使用BIRT通过Servlet访问Session数据是一个常见的需求,特别是在需要个性化报告或者基于用户状态的报告生成时。这需要开发者具备Java Web开发的基本技能,同时熟悉BIRT的API和工作原理。通过学习和实践,...

Global site tag (gtag.js) - Google Analytics