ASP.NET 状态的传递和保存

1,HTTP协议是无状态的。服务器不会记住上次给浏览器的处理结果,如果需要上次处理结果(上次状态)就需要浏览器把处理结果值(上次状态)再次给服务器。

2,URL传值:通过URL参数或者通过Form表单进行页面件的传值 (不能做到很自由的存取和读取,而且不安全)

3,Cookie :①Cookie可以用来进行更加自由的数据的存取和读取。

        ②Cookie是和站点相关的,自己域名写的只有自己的域名才可以读取。

        ③客户端向服务器发送请求的时候 处理发送Form表单信息以外还会把和站点有关的所有的Cookie发送给服务器,是强制的。

        ④服务器返回的数据处理HTML数据以外,还会返回修改的Cookie,浏览器拿到修改后的Cookie更新到本地的Cookie

        ⑤服务器端使用Cookie案例,记住用户名功能:

        A,设置页面值: Response.SetCookie(new HttpCookie("UserName",username))

        B,读取页面值: username=Request.Cookies["UserName"].Value

        ⑥浏览器关闭以后Cookie的声明周期到期,也就是Cookie的默认生命周期是浏览器的生命周期。可以通过设置Expires属性设置Cookie的过期时间:Cookie.Expires=DateTime.Now.AddDays(-1)

        ⑦Cookie在客户端是以键值对存在的

4,Cookie缺点:①客户端额可以手动清楚Cookie 所以Cookie里面存放的信息是可有可无的信息

          ②浏览器对 Cookie 的大小有限制,因此只有不超过 4096 字节才能保证被接受

          ③机密信息不能放到Cookie里面

          ④Cookie不能跨浏览器

5,Cookie的写和读: A,新建CookieTest.html页面并添加 两个按钮分别用于Cookie的读和写

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
    <form>
        <input type="submit" name="Read" value="读取Cookie" /> 
        <input type="submit" name="Write" value="写入Cookie" />

        <br />
        读取出来的Cookie: $Model.CookieValue
    </form>
</body>
</html>

B,建立对应的CookieTest.ashx页面 实现Cookie的新建写入本地以及读取Cookie的值

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace HttpNoStatus
{
    /// <summary>
    /// HttpCookie 的摘要说明
    /// </summary>
    public class CookieTest : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/html";

            //if else 判断是点击的那个按钮
            if (!string.IsNullOrEmpty(context.Request["Read"]))
            {
                if (context.Request.Cookies["Age"] != null)
                {
                    HttpCookie cookie = context.Request.Cookies["Age"];
                    string strValue = cookie.Value;
                    var data = new { CookieValue = strValue };

                    //加载模板页面并传递 Cookie Value的值
                    string strHtml = Common_Nvelocity.RenderHTML("CookieTest.html", data);
                    context.Response.Write(strHtml);
                }
                else
                {
                    context.Response.Write("cookie 不存在");
                }
            }
            else if (!string.IsNullOrEmpty(context.Request["Write"]))
            {
                //写入新的Cookie
                HttpCookie acookie = new HttpCookie("Age");
                acookie.Value = "25";
                acookie.Expires = DateTime.MaxValue;
                context.Response.Cookies.Add(acookie);

                //Cookie不存在 直接加载模板页面
                string strHtml = Common_Nvelocity.RenderHTML("CookieTest.html", null);
                context.Response.Write(strHtml);

            }

            else
            {
                //第一次加载页面
                string strHtml = Common_Nvelocity.RenderHTML("CookieTest.html", null);
                context.Response.Write(strHtml);
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

6,Cookie最主要的一个功能是保存用户的登陆名,这样用户在下次登陆的时候系统就可以自动填写登陆名称

           A,新建LoginCookie.html页面,页面中添加我们经常见到的 用户名,用户密码,登陆  

             登陆页面第一次加载的时候,设置默认的登陆名为空,登陆成功以及再次登陆的时候系统就自动补充登陆用户名

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
    <form action="LoginCookie.ashx" method="post">
        <table>
            <tr>
                <td>登陆名</td>
                <td>
                    <input type="text" name="UserName" value="$Model.LoginUser" /></td>
            </tr>
            <tr>
                <td>密码</td>
                <td>
                    <input type="password" name="Password" /></td>
            </tr>
            <tr>
                <td>
                    <input type="submit" name="Login" value="登陆" /></td>
                <td></td>
            </tr>
        </table>
    </form>
</body>
</html>

B, 新建对应的LoginCookie.ashx页面,实现把用户名读取出来并写入Cookie "ckLoginUser"

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace HttpNoStatus
{
    /// <summary>
    /// LoginCookie 的摘要说明
    /// </summary>
    public class LoginCookie : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/html";

            //加载页面直接显示 页面
            if (context.Request.Form["Login"] == null)
            {
                string strHtml = "";
                var data = new { LoginUser = "" }; //登陆账号默认为空

                //判断Cookie是否存在,如果存在 把Cookie的值传递到HTML页面,如果不存在就是默认的空
                if (context.Request.Cookies["ckLoginUser"] != null)
                {
                    data = new { LoginUser = context.Request.Cookies["ckLoginUser"].Value.ToString() };
                }
                strHtml = Common_Nvelocity.RenderHTML("LoginCookie.html", data);
                context.Response.Write(strHtml);
            }
            else
            {
                //用户登陆,保存用户名到Cookie
                HttpCookie LoginUser = new HttpCookie("ckLoginUser");
                LoginUser.Value = context.Request.Form["UserName"];
                LoginUser.Expires = DateTime.Now.AddDays(30);
                context.Response.Cookies.Add(LoginUser);
                //加载页面直接显示 页面
                string strHtml = Common_Nvelocity.RenderHTML("LoginCookie.html", new { LoginUser = context.Request.Form["UserName"] });
                context.Response.Write(strHtml);
            }

        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

7,以上方法把登陆账号以Cookie的形式存放在客户端,这样每一次的请求就可以带出用户登陆名称了

  有一种情况: 用户登陆成功以后就可以访问网站的其他所有页面,其他页面就需要先判断用户是否登陆成功。

  如果登陆成功为True放到Cookie中,这样的客户端就可以进行篡改把False改为True从而可以非法访问为授权页面了,这样放到Cookie就不安全了。

  如果登陆成功放到服务器端,那么网站的多个页面就可以直接读取到这个值,而且是安全的不会被客户端篡改的了。

8,Session原理: 把数据Value值存储在服务器端并在客户端存放Value对应的ID 。(ID,Value)都存放服务器 另外把ID以Cookie的形式存放客户端。这样就可以从客户端Cookie中抓取ID,然后从服务器端读取到ID对应的Value。

10,下面示例以Session原理实现页面判断用户是否有成功登陆:成功登陆的用户可以对特定页面进行访问、如果没有成功登陆就跳转到登陆页面。

  A. 添加类 SessionMgr.cs 在服务器端存储 键值对 ID/Value 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace HttpNoStatus
{

    public class SessionMgr
    {
        //定义键值对,存储登陆信息
        private static Dictionary<Guid, string> KeyValue = new Dictionary<Guid, string>();

        //设置键值对的值
        public static void SetKeyValue(Guid id, string value)
        {
            KeyValue[id] = value;
        }

        /// <summary>
        /// 检查客户端传递过来的键值对是否存在
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public static bool IfIdExist(Guid id)
        {
            return KeyValue.Keys.Contains(id);
        }

        //返回服务器端ID对应的Value值
        public static string GetValue(Guid id)
        {
            return KeyValue[id].ToString();
        }

    }
}

  B. 添加 LoginSession.ashx 判断用户是否登陆成功,如果登陆成功把存储对应的键值对的值

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace HttpNoStatus
{
    /// <summary>
    /// LoginSession 的摘要说明
    /// </summary>
    public class LoginSession : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/html";
            string strHtml = "";
            //读取用户名和密码
            string strUserName = context.Request.Form["txtUserName"];
            string strPwd = context.Request.Form["txtPassword"];
            if (strPwd == "123456")
            {
                //登陆成功,设置对应的键值对
                Guid id = Guid.NewGuid();   // 产生唯一的ID
                SessionMgr.SetKeyValue(id, strUserName);

                //id 保存在客户端cookie中
                HttpCookie loginCookie = new HttpCookie("LoginCookie");
                loginCookie.Value = id.ToString();
                loginCookie.Expires = DateTime.Now.AddDays(7);
                context.Response.Cookies.Add(loginCookie);

                //跳转到授权页面
                context.Response.Redirect("AuthorizationPage.ashx");

            }
            else
            {
                //登陆失败 , 加载登陆页面
                strHtml = Common_Nvelocity.RenderHTML("LoginSession.html", null);
                context.Response.Write(strHtml);

            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

  C. Templates文件夹下添加LoginSession.html 登陆页面

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
    <form action="LoginSession.ashx" method="post">
        <table>
            <tr>
                <td>登陆名</td>
                <td>
                    <input type="text" name="txtUserName" /></td>
            </tr>
            <tr>
                <td>密码</td>
                <td>
                    <input type="password" name="txtPassword" /></td>
            </tr>
            <tr>
                <td>
                    <input type="submit" name="Login" value="登陆" /></td>
                <td></td>
            </tr>
        </table>

    </form>
</body>
</html>

  D. 添加AuthorizationPage.ashx页面,只有登陆后的账户才有权限访问这个页面

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace HttpNoStatus.Templates
{
    /// <summary>
    /// AuthorizationPage 的摘要说明
    /// </summary>
    public class AuthorizationPage : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/html";

            //抓取客户端 Cookie的ID值
            HttpCookie loginCookie = context.Request.Cookies["LoginCookie"];
            if (loginCookie != null)
            {
                Guid id = new Guid(loginCookie.Value);

                // 读取id对应的Value
                string strValue = SessionMgr.GetValue(id);

                //输出Value值,并提示该账号是已经登陆的账号
                context.Response.Write(strValue + ",您已经登陆本网站,有权限访问此页面");
            }

            //如果Cookie不存在,则直接跳转到登页面
            else
            {
                context.Response.Redirect("LoginSession.ashx");
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

------------------------------------------------------------gif 动画演示----------------------------------------------------------------

 11,上面的示例是也就是Session原理。Asp.net已经内置了Session机制,下面我们直接用ASP.NET Session实现 判断用户是否有登陆成功:

   (一般处理程序HttpHandler操作Session, 要实现IRequiresSessionState接口)

  分别添加页面: LoginSessionNew.ashx(登陆一般处理程序) , LoginSessionNew.html(登陆模板), AuthorizationPageNew.ashx(登陆后才有权限访问的页面)。

  A,LoginSessionNew.ashx(登陆一般处理程序)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.SessionState;

namespace HttpNoStatus
{
    /// <summary>
    /// LoginSessionNew 的摘要说明
    /// </summary>
    public class LoginSessionNew : IHttpHandler, IRequiresSessionState
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/html";
            string strHtml = "";
            //读取用户名和密码
            string strUserName = context.Request.Form["txtUserName"];
            string strPwd = context.Request.Form["txtPassword"];
            if (strPwd == "123456")
            {
                //登陆成功,直接保存Session值

                context.Session["LoginUserName"] = strUserName;

                //跳转到授权页面
                context.Response.Redirect("AuthorizationPageNew.ashx");

            }
            else
            {
                //登陆失败 , 加载登陆页面
                strHtml = Common_Nvelocity.RenderHTML("LoginSessionNew.html", null);
                context.Response.Write(strHtml);

            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

  B,Templates模板下新建LoginSessionNew.html(登陆模板)

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
    <form action="LoginSessionNew.ashx" method="post">
        <table>
            <tr>
                <td>登陆名</td>
                <td>
                    <input type="text" name="txtUserName" /></td>
            </tr>
            <tr>
                <td>密码</td>
                <td>
                    <input type="password" name="txtPassword" /></td>
            </tr>
            <tr>
                <td>
                    <input type="submit" name="Login" value="登陆" /></td>
                <td></td>
            </tr>
        </table>

    </form>
</body>
</html>

  C,AuthorizationPageNew.ashx(登陆后才有权限访问的页面)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.SessionState;

namespace HttpNoStatus
{
    /// <summary>
    /// AuthorizationPageNew 的摘要说明
    /// </summary>
    public class AuthorizationPageNew : IHttpHandler, IRequiresSessionState
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            //检查Session是否存在

            object obj = context.Session["LoginUserName"];

            if (obj != null)
            {
                //Session存在,读取Session值,并提示该账号是已经登陆的账号
                context.Response.Write(obj.ToString() + ",您已经登陆本网站,有权限访问此页面");
            }

            //如果Session不存在,则直接跳转到登页面
            else
            {
                context.Response.Redirect("LoginSessionNew.ashx");
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

 · ASP.NET内置Session机制同样实现了对用户是否登陆成功的判断:LoginSessionNew.ashx页面Headers中我们看到了Cookie中多了ASP.NET_SessionId

   Session机制在客户端存放了ASP.NET_SessionID

  

  · 权限访问页面,请求头中读取到了客户端Cookie中的ASP.NET_SessionID

  

12, ASP.NET的Session机制: Session依赖于Cookie , 借助Cookie在客户端浏览器中记录了ID, 在服务器端存储了Value值。

13,Session的值是放到了服务器内存中,所以Session存放小数据。

  Session(会话)有自动销毁机制,如果一段时间内浏览器没有和服务器交互,则Session会定时自动销毁。

  登陆账号后,一段时间内如果不操作 系统就会自动退出,这就是Session自动销毁了。

  

Demo 下载

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索cookie
, 页面
, context
, 登陆
, ashx
, response
, cookie 自动登...
, system
, 登陆状态
, cookie的值保存失败
, session键值设置
, .netglobalc#cookie登陆
, 登陆页面
ashx中使用session
,以便于您获取更多的相关知识。

时间: 2024-10-02 16:27:55

ASP.NET 状态的传递和保存的相关文章

ASP.NET状态保存方法详解

ASP.NET状态保存分为客户端保存和服务器端保存两种: 使用客户端选项存储页信息而不使用服务器资源的这些选项往往具有最低的安全性但具有最快 的服务器性能,因为对服务器资源的要求是适度的.但是,由于必须将信息发送到客户端来进行存储,因此对于以这种方式可以存储多少信息存在一定的客观限制. 客户端保存的方式一般有如下4种: 1.ViewState: 利用场合为:在对同一页的多个请求间自动保留值,多用于客户端的一些事件.,典型利用场合为:页面信息重置, 登陆出错次数统计,Grid列排序等. 优点:不利

ASP.NET状态保存方法

ASP.NET状态保存分为客户端保存和服务器端保存两种: 使用客户端选项存储页信息而不使用服务器资源的这些选项往往具有最低的安全性但具有最快 的服务器性能,因为对服务器资源的要求是适度的.但是,由于必须将信息发送到客户端来进行存储,因此对于以这种方式可以存储多少信息存在一定的客观限制. 客户端保存的方式一般有如下4种: 1 ViewState: 利用场合为:在对同一页的多个请求间自动保留值,多用于客户端的一些事件.,典型利用场合为:页面信息重置, 登陆出错次数统计,Grid列排序等. 优点:不利

关于ASP.NET下身份信息的保存(三)

asp.net 前两节描述了我对身份验证信息的保存的认识,没有看的哥们请依次看过关于ASP.NET下身份信息的保存(二),关于ASP.NET下身份信息的保存(一) . 今天我想说一下Server.Transfer,在上两节里,我们是靠Server.Transfer方法将保存的用户信息传递到下一页的.但是在实际的应用中我发现应用前两篇文章的想法的弊端. Server.Transfer();方法在应用中只能在两个页面之间传递值,但是当加入第三个页面的时候却无法将值顺利的保存并传递. 譬如:有页面A.

ASP.NET状态管理之九(会话Session)

ASP.NET 允许您使用会话状态保存每个活动的 Web 应用程序会话的值,会话状态是 HttpSessionState 类的一个实例. 会话状态与应用程序状态相似,不同的只是会话状态的范围限于当前的浏览器会话.如果有不同的用户在使用您的应用程序,则每个用户会话都将有一个不同的会话状态.此外,如果同一用户在退出后又返回到应用程序,第二个用户会话的会话状态也会与第一个不同. 会话状态采用键/值字典形式的结构来存储特定于会话的信息,这些信息需要在服务器往返行程之间及页请求之间进行维护. 可以使用会话

ASP.NET状态管理之一(概括篇)

每次将网页发送到服务器时,都会创建网页类的一个新实例.在传统的Web编程中,这通常意味着在每一次往返行程中,与该页及该页上的控件相关联的所有信息都会丢失.例如,如果用户将信息输入到文本框,该信息将在从浏览器或客户端设备到服务器的往返行程中丢失. 状态管理是您对同一页或不同页的多个请求维护状态和页信息的过程.与所有基于 HTTP 的技术一样,Web 窗体页是无状态的,这意味着它们不自动指示序列中的请求是否全部来自相同的客户端,或者单个浏览器实例是否一直在查看页或站点.此外,到服务器的每一往返过程都

[Asp.Net]状态管理(Session、Application、Cache、Cookie 、Viewstate、隐藏域 、查询字符串)

原文:[Asp.Net]状态管理(Session.Application.Cache.Cookie .Viewstate.隐藏域 .查询字符串) Session:  1. 客户在服务器上第一次打开Asp.Net页面时,会话就开始了.当客户在20分钟之内没有访问服务器,会话结束,销毁session.(当然也可以在Web.config中设置缓存时间)可以在Global.aspx的Session_Start()事件处理程序中,可以初始化会话变量.在下面的实例中,名为mydata的会话状态被初始化为0:

ASP.NET状态服务及session丢失问题解决方案总结

原文:ASP.NET状态服务及session丢失问题解决方案总结[转载]asp.net Session的实现: asp.net的Session是基于HttpModule技术做的,HttpModule可以在请求被处理之前,对请求进行状态控制,由于Session本身就是用来做状态维护的,因此用HttpModule做Session是再合适不过了. ASP.NET中Session的状态保持方式 ASP.NET提供了Session对象,从而允许程序员识别.存储和处理同一个浏览器对象对服务器上某个特定网络应

一起谈.NET技术,在ASP.NET网页间传递数据的五种方法

重点总结 目前为止在ASP.NET网页中传递数据的方式至少有5种: 1.通过查询字符串传递数据. 2.通过HTTP POST传递数据. 3.通过会话状态传递数据. 4.通过源页的公共属性传递数据. 5.通过源页中的控件值传递数据. 到底使用哪种方式来进行数据的传递,这可能受到两方面的影响: 1.页面重定向的方式. 2.源页和目标页是否位于相同的ASP.NET应用程序中. 如果源页和目标页位于不同的ASP.NET应用程序中则只能通过查询字符串和HTTP POST传递数据. 而如果源页和目标页位于相

在ASP.NET网页间传递数据的五种方法

重点总结 目前为止在ASP.NET网页中传递数据的方式至少有5种: 1.通过查询字符串传递数据. 2.通过HTTP POST传递数据. 3.通过会话状态传递数据. 4.通过源页的公共属性传递数据. 5.通过源页中的控件值传递数据. 到底使用哪种方式来进行数据的传递,这可能受到两方面的影响: 1.页面重定向的方式. 2.源页和目标页是否位于相同的ASP.NET应用程序中. 如果源页和目标页位于不同的ASP.NET应用程序中则只能通过查询字符串和HTTP POST传递数据. 而如果源页和目标页位于相