开发api无法使用session,尝试了很多办法

1. 运行环境

1). 当前使用的 Laravel 版本?

Laravel Framework 8.83.25

2). 当前使用的 php/php-fpm 版本?

PHP 版本:PHP 8.1.8 (cli)
php-fpm 版本:

3). 当前系统

windows 11 家庭中文版

4). 业务环境

开发环境

5). 相关软件版本

nginx:1.22.0
mysql:8.0.29
redis:3.2.1

2. 问题描述?

在同一个方法中使用session可以设置,获取,再其他方法使用session获取为null
按照文档,百度,打开以前的项目看了,该加的中间件都已经添加,该做的都做了,比如在A控制器里登录用户成功后保存用户信息到session,保存完之后用get即可获取,但是在B控制器里get输出确为空,谢谢帮我看一下

3. 您期望得到的结果?

可以正确获取到session

4. 您实际得到的结果?

开发api无法使用session,尝试了很多办法

开发api无法使用session,尝试了很多办法

开发api无法使用session,尝试了很多办法

开发api无法使用session,尝试了很多办法

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 44

session 不是保存到文件的吗?看有没有保存到。

1年前 评论
流年酷 (楼主) 1年前
wozailu (作者) 1年前
流年酷 (楼主) 1年前
流年酷 (楼主) 1年前
流年酷 (楼主) 1年前
wozailu (作者) 1年前
陈先生

不如读一下 session 函数


if (! function_exists('session')) {
    /**
     * Get / set the specified session value.
     *
     * If an array is passed as the key, we will assume you want to set an array of values.
     *
     * @param  array|string|null  $key
     * @param  mixed  $default
     * @return mixed|\Illuminate\Session\Store|\Illuminate\Session\SessionManager
     */
    function session($key = null, $default = null)
    {
        if (is_null($key)) {
            return app('session');
        }

        if (is_array($key)) {
            return app('session')->put($key);
        }

        return app('session')->get($key, $default);
    }
}

我觉得你第一个图应该是想 put 的。session()->put('aaa','111'); 试试这样

1年前 评论
流年酷 (楼主) 1年前
陈先生 (作者) 1年前
流年酷 (楼主) 1年前
流年酷 (楼主) 1年前
陈先生 (作者) 1年前

我记得在API的路由中,所有的请求和响应都不会加载cookie里面的,你即使开启了session以后,在响应的同时是不会响应回去的

1年前 评论
流年酷 (楼主) 1年前

把web的第二个中间件加到api中间件里试下。用laravel的api的话,就不要用session和cookie了吧

1年前 评论
流年酷 (楼主) 1年前
流年酷 (楼主) 1年前
deatil (作者) 1年前
kkokk 1年前

1. 服务端设置session后,是否写入成功 2. 服务端设置session后,服务端响应是否有setcookie 3. 前端页面第2次请求,是否成功携带cookie至服务器 4. 服务端获取到前端携带的cookie,是否与服务端设置cookie一致 5. 如果cookie一致的话,可以通过session获取到存储的数据 ----- 注意点: 1. 如果在开发阶段,可以先暂时将cookie加密关闭 2. 服务端设置session成功的话,可以响应的cookie找到对应的存储载体,查看里面内容 3. 需要保证服务端设置的cookie与前端页面2次请求携带cookie是一致,服务端才可以根据cookie查询到对应的数据

1年前 评论

不是将session id存入cookie里的吗

1年前 评论
流年酷 (楼主) 1年前

@lhnjxdqq 1,写入成功 2.响应包含Set-Cookie 3.请求好像没有携带cookie 4.前端查看没有收到后端发送的cookie但是后端发送了cookie,

1年前 评论
dalei 1年前

@deatil 请求默认是携带的,但是本地获取不到session_id,如果不用session的话,api如何获得用户信息,我用Auth::user()也是为null,看样子和session存不了是一样的问题

1年前 评论

哪有开发api用session和cookie的啊 用缓存不行吗

1年前 评论

遇到过类似的情况 前后端跨域无法获取session最后解决方案是前端做代理同源解决了 你可以先试试同源有没有这个情况如果没有 就试试我上面的方法

1年前 评论

能不能用这个呢 Sanctum API 授权

1年前 评论
流年酷 (楼主) 1年前

api 状态应该是无状态,就是不应该发送cookie,session 是基于 cookie的。查看请求 header 中是否有携带SESSIONID 的 cookie,建议使用 jwt 或者 laravel 的 Sanctum API 授权

1年前 评论
流年酷 (楼主) 1年前
看上隔壁小花了啦 (作者) 1年前
周小云 1年前

如果 config/session.php 配置中的 encrypttrue 那么 StartSession 中间件和 EncryptCookies 的顺序很重要,否则当试图从 Cookie 中获取 Session ID 时因为因为解密失败,而导致返回的是 null,框架层会重新生成一个 Session ID!

api 组中,将 StartSession 放在 EncryptCookies 的前面试试!

1年前 评论

withCredentials允许携带ccookie,你保存之后再次请求如果不携带cookie会认为是新的用户,创建新的session_id,检查方式就是查看session_id()是否每次都一致

1年前 评论
porygonCN

api 哪里来的session? api要用就用cache

1年前 评论
laradocs

app/Http/Kernel.php

'api' => [
    \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, // 将这行的注释取消
    'throttle:api',
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
],
1年前 评论
陈先生 1年前

移动端本来就没有session,可以用jwt

1年前 评论
JaguarJack

域不同了。Session 无法共享

1年前 评论

楼主您好,请问问题解决了吗,我现在也遇到了相同的问题,怎么也不好使

5个月前 评论

app/Http/Kernel.php

    protected $middleware = [
       // ...

       // 加入 StartSession Middleware
        \Illuminate\Session\Middleware\StartSession::class,
    ];
5个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!