博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HTTP协议基础-9-HTTP session
阅读量:4302 次
发布时间:2019-05-27

本文共 2386 字,大约阅读时间需要 7 分钟。

上一篇解释了cookie, 知道了cookies是客户端技术,cookies是一些临时文件保留用户的数据。下次浏览器访问服务器之前,会先去本地找有没有对应的cookies文件。如果有,就拿cookies数据,自动登录或者保持用户的偏好设置。

Http session,session是会话的意思,专门为http无状态的特定而设计的技术,数据是存储在服务器端。这个是和cookies的明显区别。session是servlet中的技术,我学过servlet,session的原理,大致是这样:每次浏览器访问服务器,服务器为每一个浏览器访问新建一个session在服务端,然后把这个session id在响应头中返回给浏览器。浏览器每次发送请求需要带上这个session id,直到浏览器关闭退出不再访问或者session的有效期过了,这个session会在服务器端删除。具体可以看我写的这篇文章

 

1. session和cookies

早期session是依赖cookies而存在的,这个结论我们待会实战来证实下。服务器在服务端创建了session,然后把session id发给浏览器,根据不同id,服务器知道是具体哪一个session。然后浏览器请求头字段会把这个session id和id的值作为键值对添加到请求中。

我们先来准备xmapp+agileone的环境

这里需要重新安装1.6.8的xmapp版本(之前xmapp+phpwind控制面板中卸载即可),不然和agileone这个项目的php版本不兼容,登录不了,会部署失败,具体安装文档和软件请看这个链接:

浏览器打开 http://localhost/agileone 回车,看看fildder抓包的效果。

上图是http://localhost/agileone/index.php的响应头内容,重点来看上面红圈,告诉浏览器去创建一个cookies,cookies的内容是PHPSESSID=1bc4221b0c17fe83bb7cec6bf2ed22ec; path=/

这是两个键值对,重点我们看第一个,PHPSESSID这个就是服务器上专门针对这个访问产生的一个session id,这个id长度32位,每一位是16进制写法。所以实际长度是32的16次方。这么大的一个数范围足够保证每次session产生id都不会重复。到这里,证明了session是依赖本地cookies而实现的,服务器只传过来一个id,客户端会把这个session id保存在cookies文件中,下次请求,客户端才能带上这个cookies种的session id。

 

2.看看服务器端如何保存session的

这个就是我们安装xmapp+agileone的根本原因,学完了这篇,我们完全可以把本地xmapp+agilone卸载干净。

本地xmapp安装环境打开这个路径 C:\xampp\tmp

下面这张图就有一个文件是session的文件

这个文件名称sess表示session 后面跟着id,这个id和我们上面fildder抓出来的是一致。下面我们浏览器登录用户,admin/admin进行登录,勾选记住登录,点击提交。这些数据会在上面的这个session文件中写入。如果不登录,这个sesion是空内容。

userId|s:1:"1";userName|s:5:"admin";userRole|s:13:"Administrator";userEmail|s:18:"admin@agileone.net";currentProjectId|s:1:"1";currentProjectName|s:8:"Agileone";defaultProjectId|s:1:"1";myProject|a:1:{i:0;a:2:{s:9:"projectid";s:1:"1";s:8:"projname";s:8:"Agileone";}}isLogin|s:4:"true";

上面内容是我拷贝出来的,userName|s:5:"admin" 这个字段是这么一个意思,userName是key,|s s表示字符串string, 5表示长度,admin不就是5个字面长度码,“admin”是value.

上面这个isLogin 等于true,这个就是服务器判断客户端浏览器下一次打开不需要再次登录的原因。你可以把true改成false,然后刷新浏览器,你会发现之前登录状态消失,会让你去登录。

 

总结:

这种基于cookies和session的用户认证机制,最早就是这么设计的,这个isLogin就是存储状态用的。这意味着必须在服务器端和客户端保留身份验证记录或会话。 服务器需要跟踪数据库中的活动会话,而在前端创建一个包含会话标识符的cookie,因此基于名称cookie的身份验证。整个登录验证过程,在客户端和服务端经历这么几个步骤。

1.用户输入用户名和密码,点击登录

2.服务器验证用户名和密码是否正确,如果正确创建一个session,存储在数据库中。
3.然后通过响应头把session id设置在浏览器的cookies中
4.在下一次登录请求中,这个session id会传给服务器去验证,如果服务器上扎到这个session id,验证通过。
5.浏览器从cookies拿到用户名和密码去登录
6.直到用户点击退出这个应用,会在服务器上销毁这个对应的session,浏览器也会销毁对应的cookies文件。

关于第5点,这个在agileone系统特别明显,而且用户名和密码都没有经过加密处理,我们在请求头可以看到这个用户名和密码信息。这种处理很不安全的,很容易用户名和密码泄露,即使加密过用户名和密码,有些人可以破解。

转载地址:http://njows.baihongyu.com/

你可能感兴趣的文章
京东技术架构(一)构建亿级前端读服务
查看>>
git 提示:error: unable to rewind rpc post data - try increasing http.postBuffer
查看>>
php 解决json_encode中文UNICODE转码问题
查看>>
LNMP 安装 thinkcmf提示404not found
查看>>
PHP empty、isset、innull的区别
查看>>
apache+nginx 实现动静分离
查看>>
通过Navicat远程连接MySQL配置
查看>>
phpstorm开发工具的设置用法
查看>>
Linux 系统挂载数据盘
查看>>
Git基础(三)--常见错误及解决方案
查看>>
Git(四) - 分支管理
查看>>
PHP Curl发送数据
查看>>
HTTP协议
查看>>
HTTPS
查看>>
git add . git add -u git add -A区别
查看>>
apache下虚拟域名配置
查看>>
session和cookie区别与联系
查看>>
PHP 实现笛卡尔积
查看>>
Laravel中的$loop
查看>>
CentOS7 重置root密码
查看>>