cookie和session的思考

最近新开了一个bbs的项目,因为也有登录和退出,但问题来了,和大多数的公司内部项目一样,如果每个项目都有自己的登录名和密码,都得注册,每次去不同的项目用户都需要进行登录,估计用户会疯吧。其实这个问题很久之前就遇到过,当时是别的部门的项目希望通过我们这边保存的用户信息进行登录,老大的想法是写一个接口给他们使用,但是如果项目越来越多,每次写接口肯定不太合适,那位同事和我说过单点登录,趁着这次机会,自己也了解了下。

首先是 /的理解。

关于相对路径和绝对路径,一般的解释是以/开头的就是绝对路径,以./开头的就是相对路径,没有这个开头的其实也是相对路径。

这个在linux中是绝对正确的, /这个在服务器中指代的就是/目录。

但这个理论也用在前端代码中,难道我们src = ‘/assets/xxx’,是去服务器根目录下assets目录下查找文件吗,显然这个理论是不正确的,所以这个/在前端代码中的意思是网站的根目录,对!!比如这个前端网站是itbasic.datatom.com,那么这个/指代的就是apache里面配置的root文件夹,所以前端代码中的这个/是由apache或者nginx等之类的web server 部署的时候决定的。

todo:

itbasic中view文件夹不在/目录下,但是里面引用的文件相对路径却是相对/路径的,这是个很奇怪的问题。

php中有个函数setcookie,这是个在客户端种植cookie的函数,比如我们为了维持http的有状态,所以使用了session机制,通过在客户端的记录phpsessid ,然后服务器端(我用的是apache 的模块加载,默认是放在/tmp目录下)sess_(phpsessid)这个文件,这个文件中会保存你想让这个连接保存的相关信息。

那什么时候服务器端会在客户端记录phpsessid呢,是在start_session() ,这个函数调用的时候,php已经为我们封装好了对应的方法,注意setcookie,本质上是通过给浏览器头部发送消息,可以看下你调用setcookie这个方法的response,他的返回头中会有set-cookie,我的理解是如果想要返回头信息,在这之前不能有任何的输出,所以才会在start_session()之前不能有任何的输出。

setcookie函数可以看下,默认是在 当前文件所在路径下种植cookie,可以改成/,就可以在根域名下种植了,根域名下种植的好处就是下面的所有文件都能访问和删除这个cookie,如果你是在某个文件下种植的,只有当前文件才能放访问到,比如/bbs/dist,只有这个路径下的文件才能访问到。

还有放在/下的好处就是,/就在发送请求的时候他会自动的放在请求头部信息中,但是 如果你是放在/bbs/dist下面,他只会在请求/bbs/dist下的时候会携带,当访问/home之类的时候就不会携带。

还有个问题是关于重定向的,之前遇到的重定向就是爬取页面的时候会返回304,其实还有别的作用,比如cookie的种植。当今时代,api盛行,感觉这就是我忽略重定向的原因,我曾想着通过请求接口的方式进行setcookie,但好像是失败的,只能通过header()这种方式。

关于单点登录:

使用场景:其实是一个很常见的情况,公司有很多系统,但用户基本信息只用一个就好了,虽然可以通过在各个系统中通过读取同一个数据库中的同一个表来实现登录,但如果每次用户使用公司的各个系统都得登录,这种体验真是太差了,最简单的方法,如果是在相同的域名下,可以通过在根域名下种植一个cookie信息,然后每次登录检测这个信息,这样其他域名也能检测到,这样就实现了统一登录和注销。

其实itbasic就是用的这个原理,所有的同一个域名下都可以使用这个原理,itbasic稍有不同就是登录原理的不同,一个是用cookie,一个用的是token。

其实最方便扩展的还是单点登录,对于单点登录就是独立出一个登录系统,虽然各个界面都有自己的登录,但每次登录之后都会在中间系统注册一下,然后每次登录都会去中间系统检测下是否登录,如果登录了,就不用再登录了,如果没有登录,首先在自己的系统中实现登录,再去中间系统中保存已登录状态。注销的时候也是,首先在中间系统中实现注销,然后遍历删除各个子系统中的登录状态。

单点登录因为没有去实现,所以理解还不是很深刻,只知道中间的登录系统最好用https。

还有对于session,传统的是以文件的形式保存,遇到的一个bug就是itbasic服务器内容满了,导致session写入一直失败,而bbs中token的作用类似session,但是他是放在redis中存储的,就不会有这个问题,感觉这也是session用redis和memcahe实现的好处之一,而不用file实现。

坚持原创技术分享,您的支持将鼓励我继续创作!
-------------本文结束感谢您的阅读-------------