zoukankan      html  css  js  c++  java
  • 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,那么就直接返回客户需要的登陆页面

    链接地址

  • 相关阅读:
    java面试题之简单介绍一下集合框架
    java面试题之hashcode相等两个类一定相等吗?equals呢?相反呢?
    java面试题之什么是ThreadLocal?底层如何实现的?
    java面试题之stop()和suspend()方法为何不不推荐使⽤?
    设计模式—单例模式
    Java并发—同步容器和并发容器
    Java并发—并发工具类
    Java并发—原子类,java.util.concurrent.atomic包(转载)
    Java并发—java.util.concurrent.locks包
    Java并发—java.util.concurrent并发包概括(转载)
  • 原文地址:https://www.cnblogs.com/cnloop/p/9828240.html
Copyright © 2011-2022 走看看