• ASP.NET的Cookie和Session


    HTTP属于应用层,HTTP协议一共有五大特点:1、支持客户/服务器模式;2、简单快速;3、灵活;4、无连接;5、无状态。

    无状态
    HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。
    服务器不记的上次给了浏览器什么,否则服务器的压力会太大。每次请求到达asp.net,都创建一个HttpHandler的新对象来处理。

        public class TestController : Controller
        {
            int i=0;
    
            public ActionResult Index()
            {
                //每次访问Index页面TestController都会重新实例化,i每次都会实例化为0
                i = i + 1;
                return View();
            }
    
        }

    无连接
    无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

    两种用于保持 HTTP 连接状态的技术就应运而生了,一个是Cookie,一个是Session。

    Cookie的基本概念
    Cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。
    1、Cookie只是一段字符串,并不能执行。
    2、大多数浏览器规定Cookie大小不超过4K,每个站点能保存的Cookie不超过20个,所有站点保存的Cookie总和不超过300个。
    3、除了Cookie外,几乎没有其他的方法能在客户端的机器上写入数据(就连Cookie的写入操作也是浏览器进行的)。当然,连Cookie都可以通过浏览器安全配置来禁止。
    4、在使用Cookie时,必须意识到其固有的安全弱点。Cookie毕竟是存放于客户端的。因此不要在Cookie中保存保密信息,如用户名、密码、信用卡号等。在Cookie中不要保存不应该由用户掌握的内容,也不要保存可能被其他窃取Cookie的人控制的内容。
    5、不同浏览器Cookie是独立的。
    6、Cookie是把信息储存在HTTP报文头中的。

            public ActionResult Index()
            {
                //写入Cookie三种方式
                //写入Cookie时Path的问题:Path为空,当前路径和子文件夹都可以读取。
                //如果有主站及二级域名站且cookie要共享的话则要加入如下设置 cookie.Domain = ".cnblog.com";          
                //方式1
                var cookie = new HttpCookie("name", "linq");
                Response.Cookies.Add(cookie);
                //不设置Expires关闭浏览器后cookie就会失效
    
                //方式2
                Response.Cookies["name1"].Value = "linq1";
                Response.Cookies["name1"].Expires = DateTime.Now.AddHours(1);
                //方式3
                var acookie = new HttpCookie("name2");
                acookie.Value = "linq2";
                acookie.Expires = DateTime.Now.AddHours(1);
                Response.Cookies.Add(acookie);
    
                //读取Cookie的值之前,应该确保该 Cookie 确实存在。否则,您将得到一个异常
                //读取Cookie
                var httpCookie = Request.Cookies["name1"];
                if (httpCookie != null)
                {
                    var name = httpCookie.Value;
                }
    
                //修改和删除cookie 
                //修改的方法与创建方法相同
                var cookieEdit = new HttpCookie("name", "linq");
                cookieEdit.Expires = DateTime.Now.AddDays(-1); //将其有效期设置为过去的某个日期。当浏览器检查 Cookie 的有效期时,就会删除这个已过期的 Cookie。
                Response.Cookies.Add(cookieEdit);
                return View();
            }

     前端jquery.cookie.js操作cookie

    <script type="text/javascript" src="Scripts/jquery-2.2.3.min.js"></script>
    <script type="text/javascript" src="Scripts/jquery.cookie.js"></script>
    
    
    <script type="text/javascript">
        //expires:(Number | Date)有效期;设置一个整数时,单位是天;也可以设置一个日期对象作为Cookie的过期日期;
        //path:(String)创建该Cookie的页面路径;
        //domain:(String)创建该Cookie的页面域名;
        //secure:(Booblean)如果设为true,那么此Cookie的传输会要求一个安全协议,例如:HTTPS;
        $(document).ready(function () {
            //读取cookies
            var s = $.cookie('name2');
            //修改cookies
            $.cookie('name2', 'JQlinq');
            //删除cookies,修改
            $.cookie('name1', null, { expires: new Date('2016/1/6 11:44:30'), path: '/' });   //通过传递null作为cookie的值即可
        });
    
    </script>

    优点:
    ● 跨页面维持用户状态、信息
    ● 使用方便,并且能存储任何类型
    ● 能保存每个客户端的信息
    ● 安全的、透明的


    缺点:
    ● 因为Session是保存在服务端的内存中的,随着客户端请求的增多,很有可能影响到性能
    ● 在Web.conig中,sessionState节点的mode属性,如果设置为"StateServer"或"SQLServer",就必须为存储到Session中的对象打上[Serializable]。这样在存储、读取Session的时候,不断地序列化和反序列化,也会影响到性能

            public ActionResult Index()
            {
                Session.Add("aa", "aa");
                Session["aa"] = "cc";
                Session.Add("bb", "bb");
                Session.Remove("bb");
                return View();
            }

    如果我们想让Session失效:

    <system.web>
        <sessionState mode="off" />
    </sytem.web>

    这也是ASP.NET Session机制所选用的默认Mode,在该模式下,只保存当前应用程序域的数据。如果重启服务器,Session保存的数据会全部丢失(如果30分钟没调用Session就会丢失)

    <system.web>
        <sessionState mode="InProc" timeout="30" />
    </system.web>

    Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。


    Session的生命周期
    Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。
    Session的有效期
    由于会有越来越多的用户访问服务器,因此Session也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。

  • 相关阅读:
    [c/c++] programming之路(13)、函数
    [c/c++] programming之路(12)、循环结构
    opencv学习之路(18)、霍夫变换
    [c/c++] programming之路(11)、顺序分支
    opencv学习之路(17)、边缘检测
    opencv学习之路(16)、膨胀腐蚀应用之走迷宫
    [c/c++] programming之路(10)、格式符后续
    opencv学习之路(15)、形态学其他操作(开、闭、顶帽、黑帽、形态学梯度)
    opencv学习之路(14)、形态学之膨胀腐蚀
    [c/c++] programming之路(9)、运算优先级
  • 原文地址:https://www.cnblogs.com/lgxlsm/p/5517329.html
Copyright © 2020-2023  润新知