Node——cookie 与 session

基本概念

  • 客户端状态保存机制,客户端发起请求会自动携带cookie
  • 设置过期时间cookie将会持久化保存到本地磁盘;否则存储到浏览器内存中,关闭浏览器cookie将会被销毁
  • cookie与网站相关,不同网站存储着不同cookie,一个网站只会携带本网站的cookie

基本操作

  • 创建cookie

    • 服务器端设置cookie:Response.Cookies["name1"].value = "wqx1";

    • 客户端请求收到的服务器端的响应报文将会添加如下信息:Set-Cookie: name1=wqx1;path=/

    • 客户端收到此信息,由于没有设置过期时间,cookie的信息只会存在浏览器内存中

  • 创建有过期时间的cookie

    • 服务器端设置cookie:

      Response.Cookies["name2"].value = "wqx2";
      Response.Cookies["name2"].Expires = DateTime.Now.AddDays(3);
      
    • 客户端发送请求之后收到的响应报文信息:name2=wqx2;expires=Sun Oct 14 2018 15:00:06 GMT;path=/

    • 由于设置了过期时间,那么cookie的信息将会被持久化到用户本地磁盘中去

  • 如何删除用户cookie

    • 服务器端删除cookie:Response.Cookies["name2"].Expires= DateTime.Now.AddDays(-1)
    • 客户端发送删除cookie的请求之后将会收到如下报文信息:cp2=;expires=expires=Sun Oct 14 2018 15:00:06 GMT;path=/

跨域问题

  • 客户端在访问子域名的时候浏览器会携带主域名中存储的cookie
  • 客户端在访问主域名的时候浏览器不会携带子域名中存储的cookie
  • 为了能够解决访问主域名也能携带子域名中的cookie,可以进行跨域设置:Response.Cookies["name1"].Domain = "设置主域的域名"

存储路径

  • path = /,会将所有的cookie设置域名下的某一个大目录下,那么这样会造成访问某一个模块的时候,会携带所有cookie
  • 为了能够细分,可以对不同模块需要存储的cookie设置path,设置之后当客户端访问某一个模块的时候只会携带当前访问模块的cookie:Response.Cookies["name1"].path = "/xxx/xxx"

使用场景

  • 用户登陆输入自己的账号密码,点击登陆之后,希望下次输入的时候登陆账号能够自动显示

    • 前端页面:

      <input type="text" name="txtName" value="<%=LoginUserName%>"/>
      
    • 后台页面:

      public string LoginUserName {get;set;}
      protected void Page_Load(object sender, EventArgs e){
          if(IsPostBack){
      		string userName = Request.Form["txtName"];
      		Response.Cookies["userName"].value = userName;
      		Response.Cookies["userName"].Expires = DateTime.Now.AddDays(7);
          }else{
              if(Request.Cookies["userName"]!=null){
      			string name = Request.Cookies["userName"].value;
      			LoginUserName = name;
      			// 滑动过期时间,每次请求都赋予新的cookie过期时间
      			Response.Cookies["userName"].value = userName;
      		    Response.Cookies["userName"].Expires = DateTime.Now.AddDays(7);
              }
          }
      }
      
    • 实现逻辑

      • 客户第一次登陆,get请求到后台,后台获取不到浏览器携带的cookie,那么后台只会发送html页面
      • 之后客户输入账号密码之后再次登陆,发送post请求到后台,那么后台会记住用户账户并写入到cookie中
      • 客户第二次登陆,get请求到后台,此次浏览器会携带上次后台返回的cookie,后台拦截到cookie之后会在返回给客户的html模板页面中将账号塞入到input中去

session

基本概念

  • 服务端状态保存机制,存储在服务器的内存中
  • 服务器session对象是高度封装的:
    • session存储也是key-value形式,虽然不同用户存储的key是一样的,但是存储的单元是不一样的
    • session会自动在响应报文中追加一个sessionId:ASP.NET_SessionId=vxxxxxxxxxxxxxx;path=/;HttpOnly

基本使用

  • 赋值:Session["userName"] = "wqx"

  • 获取:Session["userName"]

  • 过期时间:Session.Timeout = 30,设置此对象的过期时间为30分钟,默认是20分钟,而且是滑动过期时间

  • 上面已经提到,session对象是高度封装的

    • session赋值操作,看似指向同一个key,实质不然,session对象为每一个用户都预备了一个存储空间,这个空间的编号就是sessionId,这个id会追加到响应报文中去
    • session获取操作,就是根据上面的id找到存储空间,然后找到对于的key的值

使用场景

  • 登陆:输入用户名和密码,如果正确,那么就将用户信息存储到session中
  • 校验:某些网页是需要登陆之后才能访问,所以可以获取session值,如果获取不到那么就跳转到登陆页面

自动登陆

  • 实现原理
    • 若客户端选择自动登陆那么服务端向客户端设置一个有过期时间的cookie;如果不选择自动登陆,那么客户端只是验证客户提交的账号与密码,并在服务端维持一个session
  • 基本交互
    • 原始的设计就是访问任何页面(除了登陆与注册页面)几乎都会先判断session值,没有session值就会被强制跳转到登陆页面进行登陆
    • 客户第一次访问网站,首先需要登陆,登陆页正常post提交表单,
      • 若未选择自动登陆,那么后台会在验证账号密码之后创建一个session
      • 若选择自动登陆,那么除了创建一个session,还会为客户端设置一个有过期时间的cookie
      • 最后跳转到首页
    • 客户下次再去访问网站登陆页面,发送的get请求就会被服务器劫持,服务器会先判断是否携带账户密码的cookie
      • 若有cookie,那么就判断cookie中的账户密码是否正确,正确就创建一个session,错误就将返回客户请求的页面,并且需要把原有的账户密码的cookie清空
      • 若无cookie,那么就直接返回客户需要的登陆页面

链接地址

原文地址:https://www.cnblogs.com/cnloop/p/9828240.html