Day29【Web】网页的会员卡:Session

session 的中文意思为「会话」,
在网路技术长期的演变与发展下,
session 基本上具有以下多重意义:

  1. 浏览器会话期间 1 ,也就是浏览器窗口打开到关闭的这段时间
  2. 特指某次的端对端连接
  3. 网络协议中的「面向连接 2」或「保持状态 3
  4. 用以保持客户端与服务器之间状态的解决方案
  5. 上述 4 解决方案的存储结构

本篇内容介绍的重点在第 4 项,
也就是保持客户端与服务器之间状态的解决方案。

1 会话期间狭义来说又指「Server 认得 Client 的时间区间」,比方说「从登入到登出」、「开始浏览网页到 cookie 失效」的期间。

2「面向连接(Connection-oriented)」是指传递讯息前要事先建立一条通信线路,完整通讯包含建立连接、使用连接和释放连接等过程。

3「保持状态」是指通信方能将一连串消息互相关联,让消息间保持依赖。


Session 机制

session 机制是一种服务器端的机制,
用以保持客户端与服务器之间的状态。

使用 session 机制的程序
在收到客户端请求时,
会先检查客户端请求中
是否包含「session ID」。

如果有的话,就按照 ID 检索
储存在 server 的对应 session,
如果没有的话就新建一个 session,
并生成对应的 session ID
返回给客户端保存。


实作方法

session 是一种由服务器端
保持客户状态的解决方案,
因此客户端也需要有保存方法,
才能藉由 session ID 取得对应资料。

其中一种方式就是使用 cookie,
优点是可以在交互过程中自动按照规则,
将 session ID 发送给服务器。

但 cookie 在某些状况下会被禁止,
因此也有其他机制可在
不使用 cookie 的情况下发送 session ID。


(会话)cookie

cookie 拥有过期时间,
在预设中 cookie 存活的时间
与浏览器的会话期间相同,
当会话结束,cookie 也自动消失,
这种 cookie 被称为「会话 cookie」。

会话 cookie 一般保存在记忆体中,
如果有另外设置过期时间,
就会被浏览器保存到硬碟上,
这样即使关闭再打开浏览器,
cookie 在到期前都仍能使用。

session 与 cookie 的差异

  • cookie:在客户端保存状态
  • session:在服务器端保存状态

session 机制可能需要借助 cookie 机制来达到保存标识的目的,但并非必要。


URL重写

把 session ID 直接附加在 URL 路径後方,
如果要在整个交互过程中始终保持状态,
就必须在每个客户端可能请求的路径後面
都包含这个 session ID。


表单隐藏字段

服务器会自动修改表单,
添加一个隐藏字段,
以便在表单提交时
能将 session ID 传递回服务器。

如以下表单

<form name="testform" action="/xxx">
	<input type="text">
</form>

在传递前会被服务器改写成:

<form name="testform" action="/xxx">
	<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
	<input type="text">
</form>

消失的 session

谈论 session 机制时常有一种误解是:
「只要关闭浏览器,session 就消失了。」

但服务器事实上并不会知道浏览器何时关闭,
关闭浏览器时真正消失的是会话 cookie,
於是使用会话 cookie 保存的
session ID 会在浏览器关闭时随之丢失。
因此即便再次连上同个网站,
也没有 session ID 来找到对应的 session。

与此对应的,由於关闭浏览器
不会导致 session 被删除,
服务器会为 session 另外设置失效时间,
当距离客户端上一次
使用 session 的时间超过该时效,
服务器认为客户端已经停止动,
这时才会把 session 删除以节省空间。


参考资料:


完赛结语:

这次的 30 天铁人赛完赛了,
最初的参赛动机,
是为了养成自己记笔记的习惯。

如今成功挑战 30 天日更,
也算是给了自己一份动力和信心,
即便在完赛之後也要持续产出笔记。

这几天会先调整步调,
把已有的文章整理到部落格,
之後的话应该就是
部落格跟这里两边同步更新了。

感谢看到这里的你,
程序之路只能一个人走,
但这场旅程永远都不孤单。

在此先暂时谢幕了,
待整理好脚步後再出发吧。
/images/emoticon/emoticon41.gif


<<:  This is not the end

>>:  【Day 29】Hook 09:自定义 Hook(Custom hook)

Day30-结赛感言之 This is not the end

就是今天!!想不到写着写着三十天就这样过去了~回顾这三十天的旅成还是觉得有点不可思议,真的只能用我同...

[Day14] Storybook - Colors & Typography

Storybook 除了可以为元件攥写 Story 以外,也可以攥写纯内容的说明文件,不过纯内容的说...

30-13 之 Domain Layer - Table Module

这篇文章接下来我们要谈谈《 企业应用架构模式- Martin Fowler 》这本书中所提 doma...

D-23 方法 method ? property

资料结构之後呢 在昨天大头跟小光介绍了资料结构的内容,但是有些东西大头没有跟小光特别解释,例如介面物...

AE特效烛火-Day14

六指渊参考范例:https://www.sixvfx.com/ae_combustion 今天练习烛...