cookie,seesion学习

一,为什么需要cookie和session?

1,Web应用程序是使用HTTP协议传输数据的。然而HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。所以要跟踪该会话,必须引入一种机制。

2,Cookie和 Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决 HTTP无状态的问题

二,cookie实现:

1,cookie实际上是由 Web 服务器保存在用户浏览器上的小文本文件

2,客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来(用小文本文件将资料记录下来)。

3,当浏览器再请求同一个网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。

实现和查看代码:

Cookie类

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

namespace Common
{
    public class Cookie
    {
        /// <summary>
        /// 无设置时间的cookie,如不设置时间,cookie的有效期为浏览器关闭的时候自动失效
        /// </summary>
        /// <param name="CookieName">标识</param>
        /// <param name="CookieValue">值</param>
        /// <returns></returns>
        public bool setCookieNoTime(string CookieName, string CookieValue)
        {
            try
            {
                HttpCookie cookie = new HttpCookie(CookieName);
                //cookie.Domain = ".xxx.com";//当要跨域名访问的时候,给cookie指定域名即可,格式为.xxx.com
                cookie.Value = CookieValue;
                System.Web.HttpContext.Current.Response.Cookies.Add(cookie);
                return true;
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// Cookies赋值
        /// </summary>
        /// <param name="CookieName">标识</param>
        /// <param name="CookieValue"></param>
        /// <param name="CookieDay">有效天数</param>
        /// <returns></returns>
        public bool setCookie(string CookieName, string CookieValue, int CookieDay)
        {
            try
            {
                HttpCookie cookie = new HttpCookie(CookieName);
                //cookie.Domain = ".xxx.com";//当要跨域名访问的时候,给cookie指定域名即可,格式为.xxx.com
                cookie.Expires = DateTime.Now.AddDays(CookieDay);
                cookie.Value = CookieValue;
                System.Web.HttpContext.Current.Response.Cookies.Add(cookie);
                return true;
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// 读取Cookies
        /// </summary>
        /// <param name="CookieName">标识</param>
        /// <returns></returns>
        public string getCookie(string CookieName)
        {
            HttpCookie cookie = System.Web.HttpContext.Current.Request.Cookies[CookieName];
            if (cookie != null)
            {
                return cookie.Value.ToString();
            }
            else
            {
                return null;
            }
        }

        /// <summary>
        /// 删除Cookies
        /// </summary>
        /// <param name="CookieName">标识</param>
        /// <returns></returns>
        public bool delCookie(string CookieName)
        {
            try
            {
                HttpCookie cookie = new HttpCookie(CookieName);
                //cookie.Domain = ".xxx.com";//当要跨域名访问的时候,给cookie指定域名即可,格式为.xxx.com
                cookie.Expires = DateTime.Now.AddDays(-1);
                System.Web.HttpContext.Current.Response.Cookies.Add(cookie);
                return true;
            }
            catch
            {
                return false;
            }
        }
    }
}

实现页面:

            Cookie c = new Cookie();
            c.delCookie("123");
            c.setCookieNoTime("no","no");
            c.setCookie("999", "999", 999);
<script type="text/javascript">
    window.onload = function () {
        //alert(document.cookie);
        document.getElementById("cookie").innerHTML = document.cookie;
    }
</script>
<div id="cookie">
</div>

以上方法可以在页面输出浏览器的Cookie,也正是这个原因cookie的使用时不安全的,所以在使用cookie的情况下一般会有以下几种方式:

1,设置到密码时都需要加入时间戳加密,以至于每次密文都不一样

2,客户端请求时,每次或定时更新 Cookie 内容

3,每次向 Cookie 写入时间戳,数据库需要记录最后一次时间戳

4,客户端提交 Cookie 时,先解密然后校验时间戳,时间戳若小于数据数据库中记录,即意味发生攻击。

三,session的实现:

1,Session对象是在客户端第一次请求服务器的时候创建并且当session第一次被启用时,一个唯一的标识被存储于本地的cookie中。(也就是session保存在服务器中,而不是客户端)

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

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

5,新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。而在同一个客户端的不同浏览器之间打开同一个网站也会在服务器有各自不同的session

 储存代码:

Session["lable"] = "456";

使用session代码:

 string str = Session["lable"].ToString();
原文地址:https://www.cnblogs.com/May-day/p/6668108.html