上一篇:SOLID设计原则是什么(2020-03-24 11:16:02)
文章大纲

php session写入成功,写入的值却无法获取

2020-03-24 23:51:15

最近接了个私单,跟网上前端合作开发一个小项目,我用php写后端接口,他们用Vue开发。


项目就是一个简单的后台,只允许一个帐号登录,于是登录接口我就用的session存储,如下:

$_SESSION['is_login'] = 1;


为了防止用户能够直接赋值后台里页面路径直接访问,就在Controller父类加如下判断:

if( !$_SESSION['is_login'] ){
	$this->fail("请先登录");
}


可是登录后,接口全报“请先登录”的错误提示。


var_dump($_SESSION['is_login'])打印一下,发现是NULL,即session值并没有获取成功。


这是为什么呢?


然后去服务器里去看session文件,发现有一大堆空session文件,原因是因为接口调用cookie在变导致而引起的。


例如调用登录接口,返回的头部信息里cookie是下图:




找到sess_e7i7q26idp0426eh824pq702r2文件后,里面就有记录is_login的数据:

s_login|i:1;


但是调用其它接口,前端并没有在头部里带上上面cookie,就导致每个接口返回的头部里Set-Cookie都是不同的值,说明什么?说明服务器以为是新用户,又生成了一个新的session文件,但文件为空。


请求接口头部没有一开始登录的cookie里的session_id字符串,所以服务器就找不到对应的session文件,从而就导致无法获取$_SESSION['is_login']的值。

解决办法?


在登录接口里,生成新的token,同时存到mysql数据库里,并接口返回这个token。然后前端调用接口就带上这个token,后端只需要在Controller父类里校验请求传来的token,是否跟数据库里的token一致即可。


由于本项目是一个账户的后台,所以就图简单,token存数据库即可,不用安装redis,再去存到redis里去。


本文为翟码农个人博客里有关php session方面的原创文章,转载请注明出处:http://www.zhai14.com/blog/can-not-fetch-value-from-session-even-session-is-written-successfully.html



上一篇:SOLID设计原则是什么(2020-03-24 11:16:02)
我要评论
评论列表