Loading... 今天在开发Easy-Send用户中心的时候,遇到了一个巨大的坑,给我修复了半天,觉得必须得做点记录。 经过考虑之后,我决定使用cookie来进行用户中心中的身份验证,这就需要用到PHP里面提供的setcookie函数来进行cookie的设置。 Easy-Send需要前后端的分离,所以在开发用户中心的各种功能的时候都是通过前端访问后端的接口来完成的,包括用户的登录注册,以及身份验证等。 于是,坑就出现了。前端页面的目录和后端页面目录并不是同一个目录。 按照我的想法,在后端进行完身份验证之后,使用setcookie函数向前端发送一个cookie。当前端用户想要退出登录时,直接使用js的cookie操作,清空cookie的值,然后实现用户登出。 这样的思路并没有什么问题,但是。实际操作之后发现他并不可行(严格说是按照我写的代码来看,不可行)。 先来看我刚开始写的api代码(目录:/api/user_login.php) ``````php <?php //身份验证操作,通过后执行下面的代码 setcookie("token",$token,time()+3600*24*30) //返回结果 ?> `````` js代码(用户登出):(目录:/user) ```javascript document.cookie="token=''" ``` 想我这样的小白看到前面的php代码都会觉得没有任何问题,就是向前端设置一个名为token,值为变量token的30天有效的。cookie而已。 但是,setcookie函数并不只有这三个参数。php提供的setcookie函数参数如下: ``` setcookie(name,value,expire,path,domain,secure) ``` | 参数 | 描述 | | ---------- | ---------------------------------------------------- | | *name* | 必需。规定 cookie 的名称。 | | *value* | 必需。规定 cookie 的值。 | | *expire* | 可选。规定 cookie 的有效期。 | | *path* | 可选。规定 cookie 的服务器路径。 | | *domain* | 可选。规定 cookie 的域名。 | | *secure* | 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。 | 而我的问题就出在第四个参数path上。 由于没有设置path,setcookie函数则会使用默认值,既仅在当前目录下生效。 换到我的代码中来看,就是仅在api目录下生效,而user目录下没有该Cookie。虽然这样仍能正常进行用户身份的验证,但无法在user目录下通过js直接清空cookie而实现用户登出。 解决方法有两种: 1.放弃通过js直接清空cookie,改用调用登出的接口进行登出(setcookie("tooken","")) 该方法有好处,cookie不会直接暴露在用户前端,用户无法通过开发者工具查看自己的cookie,只能找到api存储的地址才能看到cookie。但也有坏处,对于存储在不同目录下的api无法实现cookie共享。 2.添加path参数,指定cookie生效的目录 该方法便是传统的cookie存储形式,这样可以方便存储在不同目录下的api读取cookie 简单来说就是把上面的代码更改为: ```php <?php //身份验证操作,通过后执行下面的代码 setcookie("token",$token,time()+3600*24*30,"/") //返回结果 ?> ``` 这样便解决了问题。 另外记录一个差点踩到的坑:setcookie()第三个参数cookie有效期(expire)需要填写的是到期时间戳而非时长(需要进行计算time()+时长) Last modification:November 25, 2022 © Allow specification reprint Support Appreciate the author AliPayWeChat Like 如果觉得我的文章对你有用,请随意赞赏