Node——cookie 与 session
cookie
基本概念
- 客户端状态保存机制,客户端发起请求会自动携带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
- 为了能够解决访问主域名也能携带子域名中的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,那么就直接返回客户需要的登陆页面